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



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

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

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

您可以为List<>编写一个扩展方法,该方法将检查null,否则它将在其this参数上调用ForEach。称之为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));

最正确/惯用的解决方案(如果您无法避免从null集合开始)是使用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);

如果对象不是null,则可以使用调用操作的方法来模拟功能性更强的Maybe概念,这并不是说在处理操作而不是函数时,这确实比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));

您可能已经有了更好的解决方案。只是想展示一下我是怎么做到的。

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

相关内容

  • 没有找到相关文章

最新更新