使用基于条件的 linq 语法调用方法

本文关键字:linq 语法 调用 方法 条件 于条件 | 更新日期: 2023-09-27 18:36:27

如何遍历泛型列表并根据几个条件调用方法? 我想使用 linq 语法。 当然,以下这些是行不通的。 有什么想法吗?

somelist.ForEach(i => i.DeptType == 1 && i != null () {MyMethod(someInt)});

如果这是不可能的,那么使用简洁语法的下一个最佳方法是什么?

使用基于条件的 linq 语法调用方法

尝试使用 Where 指定要选择的记录,并使用 ForEach 执行方法:

somelist.Where(i => i.DeptType == 1 && i != null)
           .ToList()
           .ForEach( i=> MyMethod(i.someInt));
//standard style ... since Linq is Functional/side-effects-free
foreach(var x in somelist.Where(i => i != null && i.DeptType == 1))
{
  SomeMethod(x);
}
//anon method style ... for those that must use ForEach
somelist.ForEach(i => {if (i != null && i.DeptType == 1) {MyMethod(someInt);}});

尽管单行 LINQ 查询可能很有吸引力,但它们通常与没有任何副作用的操作(例如查询投影、筛选等)相关联。在您的情况下,使用传统的foreach循环可能会更好:

foreach (var i in somelist)
    if (i != null && i.DeptType == 1)
        MyMethod(someInt);

附言您的原始状态i.DeptType == 1 && i != null ,顺序不正确。代码仍会引起NullReferenceException,因为i.DeptType是在空检查之前执行i的。

要记住的一件事是,您应该确保在访问对象的字段之前执行空检查,如下所示:

somelist.Where(i => i != null && i.DeptType == 1).ToList().ForEach( i=> MyMethod(i.someInt));

正如上面有人指出的那样,您不能在从 Where() 调用返回的通用 IEnumerable 对象上调用 ForEach()。 必须先调用 ToList() 才能将结果保存到泛型列表。 我已经更新了上面的代码以包含该更改。

我会使用:

    somelist.Where(q => q !=null)
    .Where(q => q.DeptType == 1)
    .Select(q => MyMethod(q));

生成的集合将包含已操作的原始值/方法调用的返回值列表。