我想知道如何在使用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);