LINQ扩展List.ForEach()不返回任何内容(void),但我想为列表中的所有对象分配属性值,然后将其中一些返回为IEnumerable。
e.g。
return myCollection
.ForEach(x => x.ToBeDetermined = determine(x))
.Where(x => x.ToBeTermined == true);
答案 0 :(得分:7)
return myCollection
.Select(x => {
x.ToBeDetermined = determine(x);
return x;
})
.Where(x => x.ToBeTermined == true);
答案 1 :(得分:3)
由于您要设置布尔属性然后对其进行过滤,因此您可以使用以下语法:
return myCollection.Where(x => x.ToBeTermined = determine(x));
请注意,您至少应该在代码中写一个明确的注释,因为大多数人会将此视为拼写错误并且愿意“修复”。
答案 2 :(得分:0)
分两步完成:
myCollection.ForEach(x => x.ToBeDetermined = determine(x));
return myCollection.Where(x => x.ToBeTermined == true);
答案 3 :(得分:0)
return myCollection.Where(determine).Select(x => { x.ToBeDetermined = true; return x; });
答案 4 :(得分:0)
作为一种扩展方法,也使其比其他解决方案(也可重用)更具可读性:
public static IEnumerable<T> ForEachEx<T>(this IEnumerable<T> source, Action<T> action)
{
foreach (T item in source)
{
action(item);
}
return source;
}
这与您原始问题中的用法完全相同:
return myCollection.ForEachEx(x => x.ToBeDetermined = determine(x))
.Where(x => x.ToBeTermined == true);
与原始ForEach
的区别在于:
IEnumerable<T>
而不是void
。IEnumerable<T>
,而不仅仅是List<T>
。