[英]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.