我是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);
}
}
}
非常直截了当的是它正在做什么,但我很好奇是否有人发现更有效率,或者在您看来,“更好”的方式来实现相同的输出。
答案 0 :(得分:2)
除了争论语法以及是否使用函数样式与查询语法(使用查询语法)之外,还有更多内容。
你已经按照标准的方式进行分组和计算(除非你比大多数开发人员更深入地挖掘),你不太可能找到“更好”的方式。
仅供参考,功能语法为:
foreach (var group in numbers.GroupBy(number => number))
{
Console.WriteLine("{0}({1})", group.Key, group.Count());
}
答案 1 :(得分:2)
不 - 这看起来非常高效,紧凑且易读。
如果你关心速度,那么你可以添加AsParallel()
答案 2 :(得分:1)
不,这几乎是最合理的方式。在内部,它正在制作哈希表以存储计数,因此性能可能类似于您的旧方法。
答案 3 :(得分:1)
该查询对于您正在做的事情来说非常好(并且可能是获得所需信息的最有效的LINQ语句)。
请记住,您正在使用查询语法,因此事情看起来有点冗长,但效率并不低。
等效的lambda语法看起来像这样:
var results = numbers.GroupBy(n => n)
.Select(g => new { g.Key, Count = g.Count() });
看起来更紧凑,但完全相同。
答案 4 :(得分:1)
我会将以下代码转换为Lambda Syntax
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()
});
这可能不是一个正确的翻译,但证明了这一点。
答案 5 :(得分: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”。)< / p>