这能用单个LINQ查询实现吗?

4
假设我有一个给定的类型为 IEnumerable<string> 的对象,它是方法 SomeMethod() 的返回值,并且不包含重复元素。我希望能够通过一个单一的LINQ查询将以下行 “压缩”在一起:
IEnumerable<string> someList = SomeMethod();

if (someList.Contains(givenString))
{
    return (someList.Where(givenString));
}
else
{
    return (someList);
}
编辑:我误用了Single,正确的是First。已经纠正。

我知道可以使用三元运算符来“压缩”它,但这并不是重点。我只想能够用单行代码实现这个功能。这可行吗?


1
那个方法的返回类型是什么? - jjnguy
返回类型是 IEnumerable<string> - DotNetStudent
2
你正在返回一个IEnumerable和一个单独的字符串。 - mmcdole
你认为 someList.Single(givenString) 的含义是什么? - Jon Skeet
非常抱歉,我实际上想使用 Where(givenString) 而不是 Single(givenString) - DotNetStudent
4个回答

4
这将返回包含给定字符串的项目,如果列表中不存在给定的内容,则返回所有项目:
someList.Where(i => i == givenString || !someList.Contains(givenString))

如果存在不是给定字符串的元素,那么这个调用 .Contains 会被多次执行吗? - Joey

2
三元运算符有什么问题?
someList.Any(s => s == givenString) ? someList.Where(s => s == givenString) : someList;

最好先进行Where操作再进行Any操作,但我无法想到如何将其一行化。
var reducedEnumerable = someList.Where(s => s == givenString);

return reducedEnumerable.Any() ? reducedEnumerable : someList;

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;
        }
    }
}

该方法的懒惰性取决于集合是否包含匹配项,如果包含,则类似于使用Where方法执行。如果不包含,则大致相当于调用ToList方法(带有所有失败的筛选检查的开销)并迭代结果。


0

无法更改方法的返回类型,这就是您所要求的。第一个条件返回一个字符串,第二个条件返回一个字符串集合。

只需返回 IEnumerable<string> 集合,并像这样在返回值上调用 Single

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接