2011-03-15 67 views
1

我是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); 
     } 
    } 
} 

非常简单的东西就是它做什么,但我只是好奇,如果有人发现一个更有效,或者在您看来, “更好”的方式来完成相同的输出。

+3

不,这几乎是教科书的例子。 – 2011-03-15 21:00:24

回答

2

除了讨论语法和是否使用函数样式诗句查询语法(您使用查询语法)之外,没有更多内容。

您已经以标准方式进行分组和计数(除非您比大多数开发人员深入得多),您不太可能找到“更好”的方式。

只是为了信息,功能语法为:

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

第一反应,回答我的问题并提供其他语法 - 谢谢! – 2011-03-15 21:32:52

1

不,这几乎是做最合理的方式。在内部,它创建了一个散列表来存储计数,所以性能可能类似于您的旧方法。

2

不 - 看起来相当高效,紧凑且对我而言可读。

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

  • 但对于小的数据集,这将使性能差!
  • 和使用平行GROUPBY可能添加了大量的内存
+0

不知道AsParrallel-谢谢 – 2011-03-15 21:33:39

1

该查询要求是你在做什么(也可能是最有效的LINQ语句来得到你想要的信息)完美的罚款。

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

等效lambda语法会是这个样子:

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

看起来有点更加紧凑,但不完全一样的事情。

1

我将下面的代码转换为Lambda Syntax

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

在回应@马特·格里尔

lambda语法:

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

这可能不是一个正确的翻译,而是展现了点。

+0

你能详细说明吗? – 2011-03-15 21:04:21

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”有关的讨论学科)。