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

时间:2012-06-05 18:51:04

标签: c# .net linq c#-4.0

如何循环遍历通用列表并根据几个条件调用方法?我想使用linq语法。以下不起作用。有什么想法吗?

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

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

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

//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);}});

答案 2 :(得分:1)

作为单行LINQ查询的吸引力,它们通常与不具有任何副作用的操作相关联(例如,查询投影,过滤等)。在您的情况下,使用传统的foreach循环可能会更好:

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

P.S。您的原始条件i.DeptType == 1 && i != null订购不正确。在 NullReferenceException进行空检查之前,代码仍会生成i.DeptType,因为i已执行

答案 3 :(得分:0)

我会用:

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

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

答案 4 :(得分:0)

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

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

如上所述,您无法在Where()调用返回的Generic IEnumerable对象上调用ForEach()。您必须先调用ToList()将结果保存到通用列表。我已更新上面的代码以包含该更改。