我发现了这个方法:

public async Task SomeMethod(IEnumerable<Member> members)
{
    await DoSomething(members.First());
    await DoSomethingElse(members.First());
}

它是这样命名的:

List<Member> members = GetMembers();
await SomeMethod(members);

我知道如果GetMembers()返回IQueryable<Member>,情况可能特别糟糕,但由于只是List<Member>,这样拨打First()两次仍然不好吗? 最佳做法是调用First()一次并将结果存储在变量中吗?

推荐答案

First function in System.Linq.Enumerable

System.Linq.Enumerable中,以下是First功能的实现方式:

public static TSource First<TSource>(this IEnumerable<TSource> source)
{
    TSource? first = source.TryGetFirst(out bool found);
    if (!found)
    {
        ThrowHelper.ThrowNoElementsException();
    }

    return first!;
}

TryGetFirst被呼叫了,我们来看看:

private static TSource? TryGetFirst<TSource>(this IEnumerable<TSource> source, out bool found)
{
    if (source is null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }

    return
#if !OPTIMIZE_FOR_SIZE
        source is Iterator<TSource> iterator ? iterator.TryGetFirst(out found) :
#endif
        TryGetFirstNonIterator(source, out found);
}

然后叫了TryGetFirstNonIterator,我们来看看:

private static TSource? TryGetFirstNonIterator<TSource>(IEnumerable<TSource> source, out bool found)
{
    if (source is IList<TSource> list)
    {
        if (list.Count > 0)
        {
            found = true;
            return list[0];
        }
    }
    else
    {
        using (IEnumerator<TSource> e = source.GetEnumerator())
        {
            if (e.MoveNext())
            {
                found = true;
                return e.Current;
            }
        }
    }

    found = false;
    return default;
}

正如我们所看到的,如果资源是IList<TSource>,它确实会返回列表[0]. Source Code

Suggestion to SomeMethod

无论First如何实施.你问的问题:

我知道如果GetMembers()返回IQUeryable,这可能会特别糟糕,但由于它只是一个列表,那么这样调用First()两次仍然不好吗?最佳做法是调用First()一次并将结果存储在变量中吗?

我认为超载就是您所需要的.

public async Task SomeMethod(Member member)
{
    await DoSomething(member);
    await DoSomethingElse(member);
}
public async Task SomeMethod(IEnumerable<Member> members)
{
    await SomeMethod(members.First());
}

Csharp相关问答推荐

PostingAsJsonAschange在从调用的方法返回时给出500错误

C#中的两个线程之间读写浮点类型

EF Core在请求列表时忽略列,但在按ID获取时包含

使用LINQ to XML获取元素值列表是不起作用的

. net依赖注入如何避免服务类中的新

try 在Blazor项目中生成html

如何将Kafka消息时间戳转换为C#中的日期和时间格式?

无法通过绑定禁用条目

LINQ to Entities中的加权平均值

当使用Dapper映射DBNull时,我可以抛出异常吗?

我可以查看我们向应用程序洞察发送了多少数据吗?

源代码生成器:CS8795分部方法';Class1.GetS2(字符串)';必须有实现部分,因为它有可访问性修饰符?

CRL已过期,但ChainStatus告诉我RevocationStatus未知

C#LINQ子字符串

System.NotSupportdException:流不支持读取

C#LINQ延迟执行和嵌套方法

流畅的验证--如何为属性重用规则?

Linq SELECT的多条指令

Azure队列触发器未使用隔离的工作进程执行

.NET文档对继承的困惑