gpt4 book ai didi

c# - 何时分别使用 T[]、List、IEnumerable

转载 作者:太空狗 更新时间:2023-10-29 18:12:45 26 4
gpt4 key购买 nike

我经常发现自己在做这样的事情:

string[] things = arrayReturningMethod();
int index = things.ToList<string>.FindIndex((s) => s.Equals("FOO"));
//do something with index
return things.Distinct(); //which returns an IEnumerable<string>

我发现所有这些类型/接口(interface)的混合有点令人困惑,它触动了我潜在的性能问题触角(当然,我忽略了它,直到被证明是正确的)。

这是惯用且正确的 C# 还是有更好的替代方法来避免来回转换以访问处理数据的正确方法?

编辑:这个问题实际上是双重的:

  • 什么时候直接使用 IEnumerable 接口(interface)或数组或列表(或任何其他 IEnumerable 实现类型)是合适的(当接受参数时)?

  • 您是否应该在 IEnumerables(实现未知)和列表以及 IEnumerables 和数组以及数组和列表之间自由移动,或者是非惯用的(有更好的方法)/非性能的(通常不相关,但可能在某些情况下)/只是丑陋(不可维护,不可读)?

最佳答案

关于性能...

  • 从 List 转换为 T[] 涉及将所有数据从原始列表复制到新分配的数组。
  • 从 T[] 转换为 List 还涉及将所有数据从原始列表复制到新分配的 List。
  • 从 List 或 T[] 转换为 IEnumerable 涉及转换,这需要几个 CPU 周期。
  • 从 IEnumerable 转换为 List 涉及向上转型,这也需要几个 CPU 周期。
  • 从 IEnumerable 转换为 T[] 也涉及向上转换。
  • 您不能将 IEnumerable 转换为 T[] 或 List,除非它分别是 T[] 或 List。您可以使用 ToArray 或 ToList 函数,但这些函数也会生成副本。
  • 在 T[] 中按从头到尾的顺序访问所有值,将在一个简单的循环中优化为使用简单的指针算法——这使其成为所有方法中最快的。
  • 按顺序访问列表中的所有值需要检查每次迭代以确保您没有访问数组边界之外的值,然后才是实际访问数组值。<
  • 访问 IEnumerable 中的所有值涉及创建一个枚举器对象,调用增加索引指针的 N​​ext() 函数,然后调用为您提供实际值并将其粘贴到您指定的变量中的 Current 属性你的 foreach 声明。一般来说,这并不像听起来那么糟糕。
  • 访问 IEnumerable 中的任意值涉及从头开始并根据需要多次调用 Next() 以获取该值。一般来说,这听起来很糟糕。

关于成语...

一般来说,IEnumerable 对公共(public)属性、函数参数很有用,而且通常对返回值很有用——而且只有当您知道您将按顺序使用这些值时。

例如,如果你有一个函数 PrintValues,如果它被写成 PrintValues(List values),它只能处理 List 值,所以用户首先必须转换,例如他们使用的是 T[]。同样,如果函数是 PrintValues(T[] values)。但如果它是 PrintValues(IEnumerable values),它将能够处理列表、T[]、堆栈、哈希表、字典、字符串、集合等——任何实现 IEnumerable 的集合,这实际上是每个集合收藏。

关于内部使用...

  • 仅当您不确定列表中需要包含多少项时才使用列表。
  • 如果您知道其中需要多少项目,但需要以任意顺序访问这些值,请使用 T[]。
  • 坚持使用 IEnumerable,如果这是给您的并且您只需要按顺序使用它。许多函数将返回 IEnumerables。如果您确实需要以任意顺序访问 IEnumerable 中的值,请使用 ToArray()。

另外,请注意转换与使用 ToArray() 或 ToList() 不同——后者涉及复制值,如果您有很多元素,这确实会影响性能和内存。前者只是说“狗是一种动物,所以像任何动物一样,它可以吃东西”(沮丧)或“这只动物恰好是狗,所以它可以吠叫”(沮丧)。同样,所有列表和 T[] 都是 IEnumerable,但只有一些 IEnumerable 是列表或 T[]。

关于c# - 何时分别使用 T[]、List<T>、IEnumerable<T>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410590/

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