在Linq处理临时计算

use*_*560 4 c# linq-to-objects

在解决面试问题时

问题 当数字乘以2到9之间的整数时,需要以这种方式找到一个六位数字,当数字反转时给出原始的六位数字.

例:

假设我乘以219978*4我得到879912,当反向879912我将得到219978回来.

我用它解决了

for (long l = 100000; l < 999999; l++)
{
 var num = l.ToString();

for (int i = 3; i < 9; i++)
{
  var mul = l * i;
  string str = mul.ToString();
  char[] splitDigits = str.ToCharArray();
  string reversedDigit =
  new  string(splitDigits.Reverse().ToArray());

  if (reversedDigit.CompareTo(num) == 0)
    {
      Console.WriteLine("{0} * {1}= {2},
       when multiplied {3} ", num, i, mul,reversedDigit);

    }

 }
}
Run Code Online (Sandbox Code Playgroud)

最初的任务是使用linq解决它.例如,我在处理临时计算时有点困惑

当我使用

   var = from l in Enumerable.Range(100000,999999)
         from i in Enumerable.Range(3,9)
Run Code Online (Sandbox Code Playgroud)

什么是在linq中处理像var num = l.ToString()等临时计算的方法.在Linq中我很困惑我完成它.感谢帮助.

Mar*_*ell 5

你想let......

    // NOTE: buggy; see below
    var qry =  from l in Enumerable.Range(100000, 999999)
               from i in Enumerable.Range(3, 9)
               let s = l.ToString()
               let t = (l * i).ToString()
               where s.Reverse().SequenceEqual(t)
               select new { l, i };

    var a = qry.First();
    Console.WriteLine("an answer...");
    Console.WriteLine("{0} x {1} = {2}", a.l, a.i, a.l * a.i);

    Console.WriteLine("all answers...");
    foreach (var row in qry)
    {
        Console.WriteLine("{0} x {1} = {2}", row.l, row.i, row.l * row.i);
    }
Run Code Online (Sandbox Code Playgroud)

第一个答案(注意包含 9是从您的原始版本的代码,但可能需要使用Range(3,8)):

109989 x 9 = 989901
Run Code Online (Sandbox Code Playgroud)

优化版本(和正确的范围):

    var qry =  from l in Enumerable.Range(100000, 999999 - 100000)
               let s = l.ToString()
               let sReversed = new string(s.Reverse().ToArray())
               let wanted = int.Parse(sReversed)
               from i in Enumerable.Range(3, 8 - 3) 
               where l * i == wanted
               select new { l, i };
Run Code Online (Sandbox Code Playgroud)

这减少了创建的字符串数量,使用整数相等,并正确使用范围(第二个参数Range计数,而不是结束).