我正在使用 lambda 语句来设置我的 foreach 循环:
foreach (Shape shape in shapefile.Where(x=>x.GetMetadata(IgnoreField) != IgnoreValue))
IgnoreField
并且IgnoreValue
是可选参数。
如果这些字段为空白(未使用),我该如何更改我的 foreach 来解决这个问题?是否有 Else 声明或类似的声明?
我认为您想要的是...如果它们不为空...然后检查它们...但是如果它们为空则忽略它们对吗?
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
序列中每个项目的两个字段;它会检查它们一次,并且仅在可以的情况下应用过滤器。