C# 使用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 =

我有以下两条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 = 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确实我忘记了返回语句。非常感谢。