使用LINQ表达式设置多个类值

本文关键字:设置 LINQ 表达式 使用 | 更新日期: 2023-09-27 18:13:29

我有以下两个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();

是否可以将这两个组合在一个表达式中设置?

使用LINQ表达式设置多个类值

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();
}

旧式循环版本更短,可以立即理解,因为它是默认的习惯用法,并且在IMO上更干净。您不必在LINQ中做所有的

注意:, ForEach()不是LINQ;它是List<T>的成员。这就是为什么你必须调用ToList()来使用它。

使用lambda运算符传递在a中定义的整个lambda表达式{...}块:

myList.Where(x => x.Name == "someName").Select(x => { x.MyArray = someList.ToArray(); x.AnotherValue = GetValue(); return x;}).ToList();