这个linq查询可以更有效吗?

时间:2011-03-15 20:56:59

标签: c# linq

我是linq的新手,让自己越来越熟悉它。我刚刚用以下的linq语句替换了一堆基于字典的丑陋的分组和计数代码:

using System;
using System.Linq;

namespace WindowsForms_TestBench
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            string[] numbers = new string[] { "1", "2", "1", "1", "3", "2", "1" };

            var groupedNumbers =
                from number in numbers
                group number by number into grouped
                select new { Number = grouped.Key, Count = grouped.Count() };

            foreach (var groupedNumber in groupedNumbers)
                Console.WriteLine("{0}({1})", groupedNumber.Number,     groupedNumber.Count);
        }
    }
}

非常直截了当的是它正在做什么,但我很好奇是否有人发现更有效率,或者在您看来,“更好”的方式来实现相同的输出。

6 个答案:

答案 0 :(得分:2)

除了争论语法以及是否使用函数样式与查询语法(使用查询语法)之外,还有更多内容。

你已经按照标准的方式进行分组和计算(除非你比大多数开发人员更深入地挖掘),你不太可能找到“更好”的方式。

仅供参考,功能语法为:

foreach (var group in numbers.GroupBy(number => number))
{
    Console.WriteLine("{0}({1})", group.Key, group.Count());
}

答案 1 :(得分:2)

不 - 这看起来非常高效,紧凑且易读。

如果你关心速度,那么你可以添加AsParallel()

  • 但对于会使性能变差的小型数据集!
  • 并且使用Parallel with groupby可能会增加更多内存的需求

答案 2 :(得分:1)

不,这几乎是最合理的方式。在内部,它正在制作哈希表以存储计数,因此性能可能类似于您的旧方法。

答案 3 :(得分:1)

该查询对于您正在做的事情来说非常好(并且可能是获得所需信息的最有效的LINQ语句)。

请记住,您正在使用查询语法,因此事情看起来有点冗长,但效率并不低。

等效的lambda语法看起来像这样:

var results = numbers.GroupBy(n => n)
                     .Select(g => new { g.Key, Count = g.Count() });

看起来更紧凑,但完全相同。

答案 4 :(得分:1)

我会将以下代码转换为Lambda Syntax

var groupedNumbers =
            from number in numbers
            group number by number into grouped
            select new { Number = grouped.Key, Count = grouped.Count() };

回应@Matt Greer

Lambda语法:

var groupedNumbers = number.GroupBy(x=> x.number).Select(x=> new
                           {
                             Number = x.Key,
                             Count = x.Count()
                            });

这可能不是一个正确的翻译,但证明了这一点。

答案 5 :(得分:1)

要进一步推动John Fisher's functional example,您可以选择:

static void Main()
{
    string[] numbers = new string[] { "1", "2", "1", "1", "3", "2", "1" };

    (from number in numbers
     group number by number into grouped
     select new { Number = grouped.Key, Count = grouped.Count() }
    ).ToList().ForEach(
         group => Console.WriteLine("{0}({1})", group.Number, group.Count)
    );
}

但是,您必须使用ToList()方法,因为IEnumerable未提供ForEach界面(有关此主题的讨论,请参阅“LINQ equivalent of foreach for IEnumerable”。)< / p>