[英]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()
不,那幾乎是最合理的方法。 在內部,它正在創建一個哈希表來存儲計數,因此性能可能類似於您的舊方法。
該查詢非常適合您的工作(並且可能是獲取所需信息的最有效的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.