是否可以从.Any()中获取发现的值?

时间:2019-07-11 09:36:39

标签: c# linq

如果我使用.Any()检查列表/集合是否包含值,是否有可能以某种方式使用这些值来避免调用单独的.Where()?

例如:

if(thisList.Any(i => i.fieldCheck == thingToCheck)
{
    //use i here instead of thisList.Where(i => i.fieldCheck == thingToCheck)
}

为清楚起见进行编辑:我基本上将.Any用作null检查,以便我可以安全地使用Where的任何结果而不必进行其他检查。而不是编写用于向分配内容的代码。在这里,我想使用.Any中匹配的任何值

3 个答案:

答案 0 :(得分:2)

否,但是您可以使用foreach

foreach(var x in thisList.Where(i => i.fieldCheck == thingToCheck))
{
    //use x here 
}

如果您想在循环后知道有匹配的值,可以在其中将bool变量初始化为true。这不是很好,但是效率很高,因为您只执行一次查询。

如果结果列表不大,您还可以将匹配项放入另一个列表中,以使代码更好:

var matchingItemList = thisList.Where(i => i.fieldCheck == thingToCheck).ToList();
if(mattchingItemList.Any()) // efficient because the query is not executed again 
{
    // use matchingItemList, for example with a loop
}

如果您只希望找到一个匹配的项目,则可以使用FirstOrDefault

var x = thisList.FirstOrDefault(i => i.fieldCheck == thingToCheck);
if(x != null)
{
   // use x
}

答案 1 :(得分:0)

首先使用where,然后跳过任何以支持计数的怎么样?

        var passed = thisList.Where(i => i.fieldCheck == thingToCheck);
        if (passed.Count() > 0)
        {
            foreach (var pass in passed)
            {
                //dostuff
            }
        }

答案 2 :(得分:-1)

我写了以下扩展名来解决这个问题

public static bool AnyOut<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, out IEnumerable<TSource> result)
{
    result = default;

    List<TSource> query = new List<TSource>();

    foreach(TSource item in source)
    {
        if (predicate(item))
            query.Add(item);
    }

    if (null == query || !query.Any())
        return false;

    result = query;
    return true;
}
public static bool AnyOut<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate, out List<TSource> result)
{
    result = default;

    List<TSource> query = new List<TSource>();

    foreach (TSource item in source)
    {
        if (predicate(item))
            query.Add(item);
    }

    if (null == query || !query.Any())
        return false;

    result = query.ToList();
    return true;
}
相关问题