LINQ缩写提示

时间:2011-05-27 08:42:39

标签: c# .net linq

我有如下的LINQ查询:

foreach (var property in from property in properties where property.Name != "Type" select property)
{
}

如果不使用看起来没有吸引力的实际扩展方法(即不使用 .Where ,如:foreach (var property in properties.Where(...)),你会如何使这个陈述更简洁呢。

5 个答案:

答案 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)
{
   // ...
}

以后会阅读和调试的人会感谢你。但我仍然认为扩展方法是这里的方式