处理Linq中的临时计算(Handling temporary calculation in Lin

2019-08-19 14:51发布

当解决一个面试问题

质疑

例:

假设我乘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);

    }

 }
}

最初的任务是使用LINQ来解决它。 我在处理例如温度的计算有点混乱

当我使用

   var = from l in Enumerable.Range(100000,999999)
         from i in Enumerable.Range(3,9)

什么是处理临时的计算像VAR NUM = l.ToString()等在linq.It的方式迷惑了我很多捞起来Linq.Help表示赞赏。

Answer 1:

你想要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);
    }

与第一个答案(注意9的夹杂物是从原始的代码版本拍摄,但可能需要使用Range(3,8)代替):

109989 x 9 = 989901

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

    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 };

这减少了创建串的数量,使用整数平等,和正确地使用范围(至第二参数Range计数 ,而不是结束)。



Answer 2:

这里还有一个相匹配的问题描述为清楚起见,一些辅助方法(可能被转移到原来的LINQ查询)解决方案:

    private static IEnumerable<int> SixDigitNumbers = Enumerable.Range(100000, (999999 - 100000));
    private static IEnumerable<int> Multipliers = Enumerable.Range(2, 8);

    static void Main(string[] args)
    {

        var Solutions = from OriginalNumber in SixDigitNumbers
                              from Multiplier in Multipliers
                              let MultipliedNumber = (OriginalNumber * Multiplier)
                              where MultipliedNumber < 999999 && ResultIsNumericPalindrome(OriginalNumber, Multiplier)
                              select new { MultipliedNumber, OriginalNumber, Multiplier };


        var AllSolutions = Solutions.ToList();

    }

    private static string Reverse(string Source)
    {
        return new String(Source.Reverse().ToArray());
    }

    private static bool ResultIsNumericPalindrome(int Original, int Multiplier)
    {
        return (Original.ToString() == Reverse((Original * Multiplier).ToString()));
    }

这里是所有的解决方案:

{MultipliedNumber = 989901,OriginalNumber = 109989,乘数= 9}
{MultipliedNumber = 879912,OriginalNumber = 219978,乘数= 4}

小心Enumerable.Range - 我看到一个人回答这个问题作出排除问题说明中要求的两个数字的错误。



文章来源: Handling temporary calculation in Linq