gpt4 book ai didi

linq - FirstOrDefault() 关闭 LINQ 与 FirstOrDefault() 与 Lambda?

转载 作者:行者123 更新时间:2023-12-03 21:42:01 26 4
gpt4 key购买 nike

我有点好奇,当谈到 FirstOrDefault 时,哪种被认为是“最佳实践”。

我已经看过这个问题,它与我的问题相似,但还不够接近,无法回答我的问题。

其中哪一个是“更好的代码”?为什么?

var foos = GetMyEnumerableFoos();

var foo1 = (from f in foos
where f.Bar == "spider monkey"
select f).FirstOrDefault();

/* OR */

var foo2 = foos.FirstOrDefault(f => f.Bar == "spider monkey");

我倾向于后者,因为 IMO,它使代码更清晰。但我很好奇那里正在发生的事情的技术“胆量”是否以另一种方式更有效。如果您使用不同类型的 IEnumerables,这会改变吗?像数据表或字符串数​​组或 LINQ 对象?

==========编辑==========

假设 Jon Skeet 的帖子是正确的,我去查看 Reflector 以查看 Where 和 FirstOrDefault 是什么样的,这是我想出的:

在 foos.Where(f => f.Bar == "spider monkey").FirstOrDefault() 的情况下
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
if (source is Iterator<TSource>)
{
return ((Iterator<TSource>) source).Where(predicate);
}
if (source is TSource[])
{
return new WhereArrayIterator<TSource>((TSource[]) source, predicate);
}
if (source is List<TSource>)
{
return new WhereListIterator<TSource>((List<TSource>) source, predicate);
}
return new WhereEnumerableIterator<TSource>(source, predicate);
}

这将输入:
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
if (list.Count > 0)
{
return list[0];
}
}
else
{
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
if (enumerator.MoveNext())
{
return enumerator.Current;
}
}
}
return default(TSource);
}

对于 foos.FirstOrDefault(f => f.Bar == "spider monkey");
public static TSource FirstOrDefault<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource local in source)
{
if (predicate(local))
{
return local;
}
}
return default(TSource);
}

看着这仍然让我有点困惑,通过对某些对象类型使用适当的迭代器会增加效率吗?或者跳过所有这些并开始循环和测试是否更有效?我的直觉再次告诉我是后者。

最佳答案

好吧,无论如何编译器都会删除“选择”部分,所以你真的在比较:

foo.Where(f => f.Bar == "spider monkey")
.FirstOrDefault()

对比
foo.FirstOrDefault(f => f.Bar == "spider monkey")

我怀疑它无论如何都会对 LINQ to Objects 的效率产生任何重大影响。我个人会自己使用后一个版本……除非我想在其他地方重用查询的过滤部分。

关于linq - FirstOrDefault() 关闭 LINQ 与 FirstOrDefault() 与 Lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2148243/

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