gpt4 book ai didi

c# - 如何使[示例]扩展方法更加通用/实用/高效?

转载 作者:行者123 更新时间:2023-12-02 05:58:29 27 4
gpt4 key购买 nike

我需要一个 double[],通过跨步 y 返回一个列表,将其分成 x 元素组。非常基本...一个循环和/或一些 linq 以及所有设置。然而,我并没有在扩展方法上花费太多时间,这看起来是一些练习的不错选择。 朴素版本返回我在当前应用程序中寻找的内容......

(A)
public static IList<T[]> Split<T>(this IEnumerable<T> source, int every, int take)
{
/*... throw E if X is insane ...*/
var result = source
.Where ((t, i) => i % every == 0)
.Select((t, i) => source.Skip(i * every).Take(take).ToArray())
.ToList();
return result;
}

...返回类型是通用的...取决于您对通用的定义

我想...

(B)    
public static IEnumerable<IEnumerable<T>> Split<T>
(this IEnumerable<T> source,int every, int take){/*...*/}

...也许是一个更好的解决方案。

问题:

  • (B)是首选吗?...为什么?
  • 您会如何将 (B) 转换为 IList <T[]>
  • 重构有什么好处吗? 可能两个可能被链接的方法或类似的方法。
  • 这种方法合理吗?...或者我有吗?错过了一些基本的东西。

评论、意见和严厉的语言总是受到赞赏。

使用上下文:C# .Net 4.0

最佳答案

B 可能是更好的选择。实际上,主要的变化是代码的使用者可以选择在方法末尾使用 ToList() 将其设置为列表,而不是被迫处理列表(实际上是 IList,不能迭代) .

这在方法链接和一般用途方面有很多优点。 ToList() 是可枚举的很容易,但很难采用其他方法。因此,您可以在列表上调用 Select().Split().OrderBy() 并在 foreach 语句中使用结果,而不必让 Linq 立即迭代整个过程。

重构为yield return单个值可能会给你带来性能奖励,但由于你基本上只是返回 Select 给你的迭代器(这将一次产生一个项目)我不要认为你自己通过它屈服会得到太多好处。

关于c# - 如何使[示例]扩展方法更加通用/实用/高效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3662517/

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