2

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

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

IgnoreField并且IgnoreValue可选参数。

如果这些字段为空白(未使用),我该如何更改我的 foreach 来解决这个问题?是否有 Else 声明或类似的声明?

4

4 回答 4

4

我认为您想要的是...如果它们不为空...然后检查它们...但是如果它们为空则忽略它们对吗?

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)

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

于 2013-07-18T22:51:30.710 回答
3

这不是魔术。完全使用您在 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
于 2013-07-18T22:45:28.750 回答
2
foreach (Shape shape in shapefile.Where(x=>IgnoreField==null || IngoreValue==null || x.GetMetadata(IgnoreField) != IgnoreValue))
于 2013-07-18T22:46:33.003 回答
2

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

var query = shapefile.AsEnumerable();

if(IgnoreField!=null && IngoreValue!=null)
    query = query.Where(x=>x.GetMetadata(IgnoreField) != IgnoreValue);

foreach (Shape shape in query)
    {...}

与此处的其他答案不同,这不需要检查null序列中每个项目的两个字段;它会检查它们一次,并且仅在可以的情况下应用过滤器。

于 2013-07-22T14:13:55.207 回答