簡體   English   中英

此linq查詢能否更有效?

[英]Can this linq query be more efficient?

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

非常簡單,它在做什么,但我只是好奇是否有人發現一種更有效的方法,或者您認為是“更好”的方法來完成相同的輸出。

除了爭論語法以及是否使用函數樣式和查詢語法(您使用查詢語法)之外,它沒有更多的內容。

您已經按照標准方式進行了分組和計數,並且(除非您比大多數開發人員更深入地研究),您不太可能找到“更好”的方式。

僅用於提供信息,其功能語法為:

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

不,對我來說,這看起來非常有效,緊湊且可讀。

如果您關心速度,則可以添加AsParallel()

  • 但是對於小數據集,這會使性能變差!
  • 並與groupby一起使用Parallel可能會增加對更多內存的需求

不,那幾乎是最合理的方法。 在內部,它正在創建一個哈希表來存儲計數,因此性能可能類似於您的舊方法。

該查詢非常適合您的工作(並且可能是獲取所需信息的最有效的LINQ語句)。

請記住,您使用的是查詢語法,因此看起來有些冗長,但效率也不低。

等效的lambda語法如下所示:

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

它看起來更緊湊,但功能完全相同。

我將下面的代碼轉換為Lambda語法

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

這可能不是正確的翻譯,但可以證明這一點。

為了進一步推動John Fisher的功能示例 ,您可以采用:

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接口(有關此主題的討論,請參見“ IEnumerable的LINQ等效於foreach ”)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM