gpt4 book ai didi

c# - someIEnumerable.Select 扩展方法的代码是什么?

转载 作者:行者123 更新时间:2023-12-01 18:53:04 25 4
gpt4 key购买 nike

我是 LINQ 的新手,想编写一些扩展方法。在这样做之前,我想测试一下我是否会正确地做到这一点。我只是想将我的 CustomSelect 扩展方法与内置 Select 扩展方法的性能进行比较。

static void Main(string[] args)
{
List<int> list = new List<int>();
for (int i = 0; i < 10000000; i++)
list.Add(i);

DateTime now1 = DateTime.Now;
List<int> process1 = list.Select(i => i).ToList();
Console.WriteLine(DateTime.Now - now1);

DateTime now2 = DateTime.Now;
List<int> process2 = list.CustomSelect(i => i).ToList();
Console.WriteLine(DateTime.Now - now2);
}

public static IEnumerable<TResult> CustomSelect<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
foreach (TSource item in source)
{
yield return selector(item);
}
}

内置方法的时间跨度:0.18秒
自定义方法的时间跨度:0.35秒

更改进程的顺序会产生相同的结果。
如果我收集列表中的元素并return而不是yield return,那么时间跨度几乎与内置的相同。但据我所知,我们应该尽可能产生返回

那么内置方法的代码是什么呢?我的方法应该是什么?

提前致谢

最佳答案

我看到的主要区别是内置方法检查 List<T>并对其进行特殊处理,利用自定义 List<T>.Enumerator实现,而不是 IEnumerable<T>/IEnumerator<T> 。您可以自己处理这种特殊情况:

public static IEnumerable<TResult> CustomSelect<TSource, TResult>(
this IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
if (source is List<TSource>)
return CustomSelectList((List<TSource>)source, selector);
return CustomSelectDefault(source, selector);
}
private static IEnumerable<TResult> CustomSelectList<TSource, TResult>(
List<TSource> source, Func<TSource, TResult> selector)
{
foreach (TSource item in source)
{
yield return selector(item);
}
}
private static IEnumerable<TResult> CustomSelectDefault<TSource, TResult>(
IEnumerable<TSource> source, Func<TSource, TResult> selector)
{
foreach (TSource item in source)
{
yield return selector(item);
}
}

您可以通过手动滚动整个迭代器(这就是 WhereSelectListIterator<TSource, TResult> 所做的)来更进一步,但上面的内容可能已经足够接近了。

内置实现还处理特殊情况的数组,并处理各种形式的组合查询。

关于c# - someIEnumerable.Select 扩展方法的代码是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24548337/

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