是否存在Lambda Else条件

本文关键字:条件 Else Lambda 存在 是否 | 更新日期: 2023-09-27 18:23:47

我正在使用lambda语句设置foreach循环:

foreach (Shape shape in shapefile.Where(x=>x.GetMetadata(IgnoreField) != IgnoreValue))

IgnoreFieldIgnoreValue可选参数。

如果这些字段为空(未使用),我如何更改我的foreach以说明这一点?有Else语句或类似的语句吗?

是否存在Lambda Else条件

我想你想要的是…如果它们不是null。。。然后检查它们。。。但是如果它们为null,那么忽略它们,对吗?

foreach (Shape shape in shapefile.Where(x=>
   x.IgnoreField == null ||
   x.IgnoreValue == null ||
   x.GetMetadata(IgnoreField) != IgnoreValue)

还要注意,当你缩进你的LinQ时,它是如何更容易地看到它在做什么的?

我使用的另一种格式化技术,尤其是在像这样的foreach语句上,是在像那样在foreach语句中使用可枚举项之前,将其存储在一个适当命名的变量中…

var shapesFilteredByIgnores = shapefile.Where(x=>
   x.IgnoreField == null ||
   x.IgnoreValue == null ||
   x.GetMetadata(IgnoreField) != IgnoreValue)
foreach (Shape shape in shapesFilteredByIgnores)

当然,只有当您有一个有意义的变量名来分配它时,这一点才会更清楚。

这不是魔法。完全使用您在lambda:之外会使用的内容

foreach (Shape shape in shapefile.Where(x=>
   (x.IgnoreField != null && // If both optional fields are present
   x.IgnoreValue != null &&
   x.GetMetadata(IgnoreField) != IgnoreValue) // Then only where metadata for 
                                              // ignored field is not the ignored value
   ||
   (x.IgnoreField == null || x.IgnoreValue == null))) // But if either field absent
                                                      // then return all data
foreach (Shape shape in shapefile.Where(x=>IgnoreField==null || IngoreValue==null || x.GetMetadata(IgnoreField) != IgnoreValue))

您可以简单地根据是否有要检查的值有条件地应用Where

var query = shapefile.AsEnumerable();
if(IgnoreField!=null && IngoreValue!=null)
    query = query.Where(x=>x.GetMetadata(IgnoreField) != IgnoreValue);
foreach (Shape shape in query)
    {...}

与这里的其他答案不同,这不需要为序列中的每个项目检查null的两个字段;它检查它们一次,只有在能够的情况下才应用过滤器。