在使用ForEach lambda表达式之前,如何检查列表对象不为null

时间:2014-04-16 14:42:35

标签: c# linq

我想知道在使用ForEach循环之前,检查列表对象如何不为null。下面是我正在尝试的示例代码:

List<string> strList   ;
strList.ForEach (x => Console.WriteLine(x)) ;

我在lambda表达方面寻找解决方案,不想使用if语句。

3 个答案:

答案 0 :(得分:1)

您可以为List<>编写扩展方法,该方法将检查null,否则将在其ForEach参数上调用this。称之为ForEachWithNullCheck或类似的东西,你会没事的。

public static void ForEachWithNullCheck<T>(this List<T> list, Action<T> action)
{
  if (list == null)
  {
    // silently do nothing...
  }
  else
  {
    list.ForEach(action); 
  }
}

用法示例:

List<string> strList;
strList.ForEachWithNullCheck(x => Console.WriteLine(x));

答案 1 :(得分:0)

您可能已经有了更好的解决方案。只想表明我是如何做到的。

List<string> strList   ;
strList.ForEach (x => string.IsNullOrEmpty(x)?Console.WriteLine("Null detected"): Console.WriteLine(x)) ;

在我的场景中,我在foreach中总结了一个值,如下所示。

double total = 0;
List<Payment> payments;
payments.ForEach(s => total += (s==null)?0:s.PaymentValue);

答案 2 :(得分:-1)

最正确/惯用的解决方案(如果您不能avoid having a null collection to begin with)是使用if

if(list != null)
    foreach(var str in list)
        Console.WriteLine(str);

if放入lambda并不会使任何事情变得更容易。事实上,它只会创建更多工作。

当然,如果您真的讨厌使用if 可以避免它,而不是它真的对您有所帮助:

foreach(var str in list??new List<string>())
    Console.WriteLine(str);

foreach(var str in list == null ? new List<string>() : list)
    Console.WriteLine(str);

如果对象不是Maybe,您可以使用调用操作的方法来模拟功能更强的样式null概念,而不是这比null检查更容易在处理动作而不是函数时:

public static void Maybe<T>(this T obj, Action<T> action)
{
    if (obj != null)
        action(obj);
}

strList.Maybe(list =>
    foreach(var str in list)
        Console.WriteLine(str));