2011-10-11 75 views
4

假设我有一个IEnumerable<string>类型的给定对象,它是方法SomeMethod()的返回值,它不包含重复的元素。我希望能够“压缩”在一个单一的LINQ查询下面几行:单个LINQ查询可以实现吗?

IEnumerable<string> someList = SomeMethod(); 

if (someList.Contains(givenString)) 
{ 
    return (someList.Where(givenString)); 
} 
else 
{ 
    return (someList); 
} 

编辑:我错误地使用Single代替First。现在更正。

我知道我可以通过使用三元运算符来“拉”这个,但这不是重点。我只列出能够用一条线实现这一点。那可能吗?

+1

该方法的返回类型是什么? – jjnguy

+0

返回类型是'IEnumerable '。 – DotNetStudent

+2

您正在返回一个IEnumerable和一个字符串。 – mmcdole

回答

2

所需输出的本质要求,你要么让两个请求的数据,像你现在的样子,或缓冲不匹配,返回,如果没有找到匹配。后者在实际获取数据是相对昂贵的调用(例如:数据库查询或WCF服务)的情况下特别有用。缓冲方法是这样的:

static IEnumerable<T> AllIfNone<T>(this IEnumerable<T> source, 
            Func<T, bool> predicate) 
{ 
    //argument checking ignored for sample purposes 
    var buffer = new List<T>(); 
    bool foundFirst = false; 
    foreach (var item in source) 
    { 
     if (predicate(item)) 
     { 
      foundFirst = true; 
      yield return item; 
     } 
     else if (!foundFirst) 
     { 
      buffer.Add(item); 
     } 
    } 

    if (!foundFirst) 
    { 
     foreach (var item in buffer) 
     { 
      yield return item; 
     } 
    } 
} 

这种方法的懒惰是要么的WhereToList取决于如果集合包含匹配与否。如果确实如此,则应该执行类似于Where的执行。如果没有,你将大致执行调用ToList(以及所有失败的过滤器检查的开销)并迭代结果。

4

这将返回给定的字符串项目或如果给所有项目没有出现在列表中:

someList.Where(i => i == givenString || !someList.Contains(givenString)) 
+0

如果有元素不是givenString,那么这个调用是否包含很多次? – Joey

0

这是不可能改变的方法,返回类型,是你问。第一个条件返回一个字符串,第二个条件返回一个字符串集合。

只返回IEnumerable<string>收集,并在返回值是这样叫Single

string test = ReturnCollectionOfStrings().Single(x => x == "test"); 
2

有什么不对的三元运算符?

someList.Any(s => s == givenString) ? someList.Where(s => s == givenString) : someList; 

这将是更好的做任何之后,但我不能想到如何单行。

var reducedEnumerable = someList.Where(s => s == givenString); 

return reducedEnumerable.Any() ? reducedEnumerable : someList; 
相关问题