列出<t> .ForEach()设置属性,返回IEnumerable?</t>

时间:2014-01-10 13:21:26

标签: c# linq

LINQ扩展List.ForEach()不返回任何内容(void),但我想为列表中的所有对象分配属性值,然后将其中一些返回为IEnumerable。

e.g。

return myCollection
     .ForEach(x => x.ToBeDetermined = determine(x))
     .Where(x => x.ToBeTermined == true);

5 个答案:

答案 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的区别在于:

  1. 返回IEnumerable<T>而不是void
  2. 适用于每个IEnumerable<T>,而不仅仅是List<T>