C# 使用LINQ表达式设置多个类值
我有以下两条LINQ语句,它们在列表中的同一项中设置了不同的值C# 使用LINQ表达式设置多个类值,c#,linq,C#,Linq,我有以下两条LINQ语句,它们在列表中的同一项中设置了不同的值 List<MyClass> myList = GetList(); myList.Where(x => x.Name == "someName").Select(x => x.MyArray = someList.ToArray()).ToList(); myList.Where(x => x.Name == "someName").Select( x => x.AnotherValue =
List<MyClass> myList = GetList();
myList.Where(x => x.Name == "someName").Select(x => x.MyArray = someList.ToArray()).ToList();
myList.Where(x => x.Name == "someName").Select( x => x.AnotherValue = GetValue()).ToList();
List myList=GetList();
myList.Where(x=>x.Name==“someName”).Select(x=>x.MyArray=someList.ToArray()).ToList();
其中(x=>x.Name==“someName”).Select(x=>x.AnotherValue=GetValue()).ToList();
是否可以将这两者组合在一个表达式中
myList
.Where(x => x.Name == "someName")
.ToList()
.ForEach(x => {
x.MyArray = someList.ToArray();
x.AnotherValue = GetValue();
});
为什么要在每个表达式的末尾调用ToList()
,并丢弃结果
此外,Jon Skeet认为这是对LINQ的滥用,尤其是在您的原始形式中:很明显,LINQ表达式甚至不一定要被完全枚举。您需要那些ToList()
调用来实现任何事情,这一事实应该会让您产生一种严重而令人不安的感觉,即您误用了一种语言功能。当你不得不做一些奇怪的事情来使用你选择的构造,而不是通常的方式来做的时候,完成让它工作(因为怪异很酷),然后在你签入它之前回去用无聊、蹩脚的方式重做它
与此版本相比,上面的LINQ+ForEach()
版本有什么优势
foreach (var x in myList.Where(x => x.Name == "someName"))
{
x.MyArray = someList.ToArray();
x.AnotherValue = GetValue();
}
旧式循环版本更短,可以立即理解,因为它是默认的习惯用法,而且更干净。你不必对林克做任何事
注意,ForEach()
不是LINQ;它是列表
的成员。这就是为什么您必须调用ToList()
才能使用它
为什么要在每个表达式的末尾调用ToList()
,并丢弃结果
此外,Jon Skeet认为这是对LINQ的滥用,尤其是在您的原始形式中:很明显,LINQ表达式甚至不一定要被完全枚举。您需要那些ToList()
调用来实现任何事情,这一事实应该会让您产生一种严重而令人不安的感觉,即您误用了一种语言功能。当你不得不做一些奇怪的事情来使用你选择的构造,而不是通常的方式来做的时候,完成让它工作(因为怪异很酷),然后在你签入它之前回去用无聊、蹩脚的方式重做它
与此版本相比,上面的LINQ+ForEach()
版本有什么优势
foreach (var x in myList.Where(x => x.Name == "someName"))
{
x.MyArray = someList.ToArray();
x.AnotherValue = GetValue();
}
旧式循环版本更短,可以立即理解,因为它是默认的习惯用法,而且更干净。你不必对林克做任何事
注意,
ForEach()
不是LINQ;它是列表
的成员。这就是为什么您必须调用ToList()
才能使用它 只需使用lambda运算符传递在
{…}
块:
myList.Where(x => x.Name == "someName").Select(x => { x.MyArray = someList.ToArray(); x.AnotherValue = GetValue(); return x;}).ToList();
只需使用lambda运算符传递在
{…}
块:
myList.Where(x => x.Name == "someName").Select(x => { x.MyArray = someList.ToArray(); x.AnotherValue = GetValue(); return x;}).ToList();
理想情况下,根本不要这样做。使用
foreach
循环。在Select
子句中添加这样的副作用并不是LINQ的用意。理想情况下,不要这样做。使用foreach
循环。在像这样的Select
子句中添加副作用并不是LINQ的本意。他调用ToList
显然是为了执行Select
:)他调用ToList
显然是为了执行Select
:)Select lambda是Func
;在你的例子中它返回什么?@EdPlunkett确实我忘记了返回语句。非常感谢。选择lambda是Func
;在你的例子中它返回什么?@EdPlunkett确实我忘记了返回语句。非常感谢。