将嵌套循环转换为LINQ语句

时间:2014-04-26 20:08:38

标签: c# linq

我正在尝试将此转换为循环:

for (int i = 100; i < 1000; i++)
{
    for (int j = 100; j < 1000; j++)
    {
        if (IsPalindrome(i * j))
        {
            palindromes.Add(i * j);
        }
    }
}

// For some reason the list is not sorted correctly, but when sorted it works.
palindromes.Sort();
Console.WriteLine(palindromes.Last());

在单个LINQ语句中,我正在弄乱乘法,但这是我到目前为止,不幸的是它似乎没有正确递增导致错误的数字集合。

var palis = Enumerable.Range(100, 999)
                      .Select(n => n * Enumerable.Range(100, 999)
                                                 .Aggregate((ctr, num) => ctr++))
                      .Where(n => IsPalindrome(n)).Max();

3 个答案:

答案 0 :(得分:2)

你试过了吗?

var palindromeMax = (from i in Enumerable.Range(100, 999)
                     from j in Enumerable.Range(100, 999)
                     where IsPalindrome(i * j)
                     select i * j).Max();

答案 1 :(得分:2)

Réda Mattar's answer已接近,但有一些问题:

  1. Enumerable.Range的第二个参数是要返回的整数。这应该是900(因为你的循环从100到999)。
  2. 从高范围开始并简单地返回为j的每个值找到的第一个回文而不是遍历每个可能的整数组合会更有效。
  3. 我建议采用略有不同的形式:

    var maxPalindrome = 
        (from i in Enumerable.Range(1, 900)
         select (from j in Enumerable.Range(1, 900)
                 let p = (1000 - i) * (1000 - j)
                 where IsPalindrome(p)
                 select p).FirstOrDefault()).Max();
    Console.WriteLine(maxPalindrome);
    

    但是使用Linq通常在效率方面有开销。通过采用上面提到的建议并简单地重写for - 循环可以使这种方法更有效:

    int maxPalindrome = 0;
    for(int i = 999; i >= 0; i--) 
    {
        for(int j = 999; j >= 0; j--) 
        {
            var p = i * j;
            if (p <= maxPalindrome) 
            {
                break;
            }
            if (IsPalindrome(p)) 
            {
                maxPalindrome = p;
                break;
            }
        }
    }
    
    Console.WriteLine(maxPalindrome);
    

    快速基准测试给出以下结果(超过10次试验):

    • 原始代码:04.14s
    • RédaMattar的方法:05.59s
    • My Linq方法:02.95s
    • 我的for - 循环方法:0.04s

    如您所见,for循环可提供最佳性能。但是,效率不应该是您唯一关注的问题。通常,您应该选择最容易阅读和维护的解决方案。

答案 2 :(得分:2)

不要这样做。生成的LINQ表达式比您开始使用的代码更难理解。以其他答案为例 - 很难让这个LINQ表达式正确,并且很难准确理解它的作用。

保留自己的代码 - 没关系。