在哪些情况下我应该使用LINQ to Objects?
显然我可以在没有LINQ的情况下做任何事情.那么在哪些操作中LINQ实际上可以帮助我编写更短和/或更可读的代码?
这个问题引发了这个问题
我发现LINQ to Objects在所有地方都很有用.它解决的问题非常普遍:
您有一些数据项的集合
您需要另一个集合,由原始集合形成,但经过某种转换或过滤后.这可能是排序,投影,应用谓词,分组等.
这是我经常遇到的情况.编程领域非常多,主要涉及将一个集合(或数据流)转换为另一个集合.在这些情况下,使用LINQ的代码几乎总是更短且更易读.我想指出LINQ不应该被认为是查询表达式的同义词 - 如果只需要一个运算符,那么正常的"点符号"(使用扩展方法)通常可以更短且更易读.
其中一个原因,我特别喜欢LINQ到对象是,它是如此普遍-而LINQ to SQL是可能只涉足数据层(或几乎成为了数据层),LINQ到对象是适用于每一个层,并在各种应用程序中.
举个例子,这是我的MiniBench基准测试框架中的一行,将TestSuite
(基本上是命名的测试集合)转换为ResultSuite
(命名的结果集合):
return new ResultSuite(name, tests.Select(test => test.Run(input, expectedOutput)));
如果ResultSuite
需要针对某些特定的"标准"结果进行缩放,则再次:
return new ResultSuite(name, results.Select(x => x.ScaleToStandard(standard, mode)));
没有LINQ编写这段代码并不难,但LINQ只是让它更清晰,让你专注于真正的"逻辑",而不是迭代循环并将结果添加到列表等的细节.
即使LINQ本身不适用,一些主要包含在LINQ中的功能(例如隐式类型局部变量,lambda表达式,扩展方法)也非常有用.
答案几乎无处不在.更好的问题是何时不使用它.
LINQ非常适合"滑坡".想想许多常见操作涉及的内容:
哪里.只写一个foreach循环和一个"if"
选择.创建目标类型的空列表,遍历原始文件,转换每个目标类型并将其添加到结果中.
OrderBy.只需将其添加到列表中并调用.Sort()即可.或实施冒泡排序;)
ThenBy(从为了通过PropertyA,然后通过PropertyB).相当难一点.自定义比较器和Sort应该可以解决问题.
GroupBy - 创建一个Dictionary
并遍历所有项目.如果没有密钥存在,则创建它,然后将项添加到适当的列表中.
在每种情况下,程序方式都需要比LINQ方式更多的代码.在"if"的情况下,它更多几行; 在GroupBy或OrderBy/Then的情况下,它还有很多.
现在采取一种将它们组合在一起的常见情况.你突然想到一个10-20线的方法,可以在LINQ中用3-4线解决.LINQ版本保证更容易阅读(一旦熟悉LINQ).
那你什么时候使用LINQ?我的回答:每当你看到"foreach":)