gpt4 book ai didi

c# - LINQ 是否尝试一次性解决问题?

转载 作者:太空狗 更新时间:2023-10-29 20:58:34 25 4
gpt4 key购买 nike

假设我们有 list.Where(p=>p.Number > n).Select(p=> p.Name).Where(n=> n.StartsWith(a)).ToList(); 这将运行一次通过算法还是 3 次通过?

最佳答案

list 只会在该代码中迭代一次,而不是 3 次。

当然,如果您想测试任意查询是否多次迭代源代码,通过实验进行测试很容易,只需创建一个 IEnumerable,当您尝试多次迭代它时会抛出异常:

public static IEnumerable<T> ThereCanBeOnlyOne<T>(this IEnumerable<T> source)
{
return new SingleEnumerable<T>(source);
}

private class SingleEnumerable<T> : IEnumerable<T>
{
private bool hasRun = false;
private IEnumerable<T> wrapped;
public SingleEnumerable(IEnumerable<T> wrapped)
{
this.wrapped = wrapped;
}
public IEnumerator<T> GetEnumerator()
{
if (hasRun)
throw new InvalidOperationException(
"Sequence cannot be enumerated multilpe times");
else
{
hasRun = true;
return wrapped.GetEnumerator();
}
}

IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}

现在你可以写:

list.ThereCanBeOnlyOne()
.Where(p=>p.Number > n)
.Select(p=> p.Name)
.Where(n=> n.StartsWith(a))
.ToList();

如果代码抛出异常,则表明您尝试多次迭代基础列表。如果没有,那是你没有。

关于c# - LINQ 是否尝试一次性解决问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25573269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com