我有以下两个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();
是否可以将它们组合起来,以便在一个表达式中设置两个?
答案 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();