我有名单,我;只想根据LinQ / LAMBDA的某些标准选择
我的代码是
Lists.ForEach(x => x.IsAnimal == false { /* Do Something */ } );
我收到错误“此部分x.IsAnimal == false
我知道我们可以通过for循环轻松实现这一目标,但我想通过使用LinQ / LAMBDA了解更多信息
答案 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);
}
}