我有如下的LINQ查询:
foreach (var property in from property in properties where property.Name != "Type" select property)
{
}
如果不使用看起来没有吸引力的实际扩展方法(即不使用 .Where ,如:foreach (var property in properties.Where(...)
),你会如何使这个陈述更简洁呢。
答案 0 :(得分:3)
你真的不能......
您可以将查询放入单独的行中。
var selectedProperties = from property in properties
where property.Name != "Type"
select property;
foreach (var property in selectedProperties)
{
}
或者你可以将查询分解为一个单独的方法,如果它真的很大。
foreach ( var property in ComplexSelectionOfProperties () )
...
但实际上我会说在这种情况下的exention方法更整洁。只有当查询变得更复杂并且涉及联接时,查询语法才会变得更整洁。 (IMHO)
答案 1 :(得分:2)
美丽总是在旁观者的眼中:)
但是在这种情况下,我会创建一个过滤非Type属性并迭代其结果的方法。
这样的事情:
IEnumerable<IProperty> GetNonTypeProperties(IEnumerable<IProperty> properties)
{
return (from property in properties where property.Name != "Type" select property);
}
void foo()
{
foreach (var property in GetNonTypeProperties(properties))
{
}
}
答案 2 :(得分:2)
缺乏简洁性恰恰来自sql样式语法:使用“点”表示法,你将明智地缩短你的表达:
foreach (var property in properties.Where(property => property.Name != "Type"))
{
}
如果你想缩短显然是布尔测试的最长部分,你必须把它放在其他地方。
在foreach循环中:
foreach (var property in properties)
{
if(property.Name != "Type")
{
...
}
}
如果是单独的功能:
foreach (var property in properties.Where(IsNotType))
{
}
//and farther :
bool IsNotType(Property p)
{
return property.Name != "Type";
}
但是无论如何你想要对每个元素执行一个带有测试的循环,所以不管怎样,你都需要对它进行编码,这将花费最少量的字符。
答案 3 :(得分:2)
如果您不喜欢lambda表达式,而不是扩展方法本身,您可以使用查询内部创建自己的扩展方法,如下所示:
public static IEnumerable<Property> PropertiesExceptType(this IEnumerable<Property> properties) {
return from property in properties
where property.Name != "Type"
select property;
}
并使用它:
foreach(var property in properties.PropertiesExceptType()) {
// ...
}
在单独的方法中封装查询的好处是,您可以使用循环调试方法并动态更改代码(如果您在此方法中有linq查询,VS将不允许您这样做)。
答案 4 :(得分:1)
老实说,var propery in properties.Where()
没有看到任何错误,它比IMO中的任何查询表达式要好得多。但是如果你想坚持你的查询,至少要引入一个变量:
var filteredProperties = from property in properties
where property.Name != "Type"
select property;
foreach(var property in filteredProperties)
{
// ...
}
以后会阅读和调试的人会感谢你。但我仍然认为扩展方法是这里的方式