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

时间:2016-10-17 20:05:24

标签: 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 = GetValue()).ToList();

是否可以将它们组合起来,以便在一个表达式中设置两个?

2 个答案:

答案 0 :(得分:4)

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执行所有

N.B。,ForEach()不是LINQ;它是List<T>的成员。这就是为什么你必须致电ToList()来使用它。

答案 1 :(得分:1)

只需使用lambda运算符传递一个在a中定义的整个lambda表达式 {...}阻止:

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