Lists.ForEach使用LINQ / LAMBDA选择标准

时间:2013-01-03 12:56:32

标签: c# linq

我有名单,我;只想根据LinQ / LAMBDA的某些标准选择

我的代码是

Lists.ForEach(x => x.IsAnimal == false { /* Do Something */ } );

我收到错误“此部分x.IsAnimal == false

中只有”赋值,调用,递增,递减和新对象表达式可用作语句“

我知道我们可以通过for循环轻松实现这一目标,但我想通过使用LinQ / LAMBDA了解更多信息

7 个答案:

答案 0 :(得分:19)

在使用ForEach之前,只需使用 Where ToList

Lists.Where(x => !x.IsAnimal).ToList().ForEach(...)

答案 1 :(得分:18)

这是行不通的,因为你不能false{}构建。

Lists.ForEach(x => { 
                  if(x.IsAnimal){
                       //Do Something
                  }
             } );

答案 2 :(得分:6)

请阅读syntax of lambda expressions:lambda表达式代表一种方法; =>之前的部分是参数列表,之后的部分是返回结果的单个表达式,或方法体。

您可以在该方法体中添加限制:

Lists.ForEach(x => {
                  if (!x.IsAnimal) {
                      // do something
                  }
              });

答案 3 :(得分:3)

应该是这样的:

things.Where(x => !x.IsAnimal).ToList().ForEach(x => { // do something });

我可以看到人们抱怨必须建立新的列表才能使用ForEach。您可以使用Select执行相同的操作并坚持使用IEnumerable:

things.Where(x => !x.IsAnimal).Select(x => 
{
    // do something with it
    return x; // or transform into something else.
});

答案 4 :(得分:0)

请注意, 是lists.foreach和普通foreach之间的区别。每个“正常”使用枚举器,因此更改迭代列表是非法的。 lists.foreach()不使用枚举器(如果我不误认为它在后台使用了索引器),可以随时更改数组中的项目。

希望这有帮助

答案 5 :(得分:0)

如果你想使用" ForEach"对于不同类型的集合,您应该为IEnumerable编写扩展:

public static class IEnumerableExtension
{
    public static void ForEach<T>(this IEnumerable<T> data, Action<T> action)
    {
        foreach (T d in data)
        {
            action(d);
        }
    }
}

使用此扩展程序,您可以在使用ForEach之前进行过滤,并且您不必使用过滤后的项目形成新列表:

lists.Where(x => !x.IsAnimal).ForEach( /* Do Something */  );

我更喜欢标准版:

foreach (var x in lists.Where(x => !x.IsAnimal)) { /* Do Something */ }

不是很长很明显是一个带有副作用的循环。

答案 6 :(得分:-2)

尝试这样的代码:

 class A {
    public bool IsAnimal { get; set; }
    public bool Found { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        List<A> lst = new List<A>();

        lst.Add(new A() { IsAnimal = false, Found = false });
        lst.Add(new A() { IsAnimal = true, Found = false  });
        lst.Add(new A() { IsAnimal = true, Found = false  });
        lst.Add(new A() { IsAnimal = false, Found = false  });

        // Here you first iterate to find only items with (IsAnimal == false)
        // then from IEnumerable we need to get a List of items subset
        // Last action is to execute ForEach on the subset where you can put your actions...
        lst.Where(x => x.IsAnimal == false).ToList().ForEach(y => y.Found = true);
    }
}