2011-03-15 69 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」有關的討論學科)。