gpt4 book ai didi

.net - List (of T) 和 Collection(of T) 有什么区别?

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

我见过它们以很多相同的方式使用,我担心如果我不能更好地理解这一点,我将走上一条不可逆转的设计道路。另外,我正在使用 .NET。

最佳答案

在 C# 中,存在表示对象包的三个概念。按照功能增加的顺序,它们是:

  • 可枚举 - 无序、不可修改
  • 集合 - 可以添加/删除项目
  • 列表 - 允许项目有顺序(通过索引访问和删除)

可枚举没有顺序。您无法从集合中添加或删除项目。您甚至无法计算集合中的项目数。它严格允许您一个接一个地访问集合中的每一项。

集合是一个可修改的集合。您可以从集合中添加和删除对象,还可以获取集合中的项目数。但仍然没有顺序,因为没有顺序:无法通过索引访问项目,也无法排序。

列表是一组有序的对象。您可以对列表进行排序、按索引访问项目、按索引删除项目。

事实上,当查看这些接口(interface)时,它们是相互构建的:

  • interface IEnumerable<T>

    • GetEnumeration<T>
  • interface ICollection<T> : IEnumerable<T>

    • Add
    • Remove
    • Clear
    • Count
  • interface IList<T> : ICollection<T>

    • Insert
    • IndexOf
    • RemoveAt

声明变量或方法参数时,应该选择使用

  • IEnumerable
  • ICollection
  • 列表

基于概念上您需要对这组对象执行的操作。

如果您只需要能够对列表中的每个对象执行某些操作,那么您只需要 IEnumerable :

void SaveEveryUser(IEnumerable<User> users)
{
for User u in users
...
}

您不关心用户是否保存在 List<T> 中, Collection<T> , Array<T>或其他任何东西。您只需要IEnumerable<T>界面。

如果您需要能够添加、删除或计算集合中的项目,请使用集合:

ICollection<User> users = new Collection<User>();
users.Add(new User());

如果您关心排序顺序,并且需要正确的顺序,则使用列表:

IList<User> users = FetchUsers(db);

以图表形式:

| Feature                | IEnumerable<T> | ICollection<T> | IList<T> |
|------------------------|----------------|----------------|----------|
| Enumerating items | X | X | X |
| | | | |
| Adding items | | X | X |
| Removing items | | X | X |
| Count of items | | X | X |
| | | | |
| Accessing by index | | | X |
| Removing by index | | | X |
| Getting index of item | | | X |

List<T>Collection<T>System.Collections.Generic是两个实现这些接口(interface)的类;但它们并不是唯一的类:

因此您可以轻松更改:

IEnumerable<User> users = new SynchronizedCollection<User>();

SaveEveryUser(users);

tl;博士

  • 可枚举 - 访问项目、无序、不可修改
  • 集合 - 可以修改(添加、删除、计数)
  • 列表 - 可以通过索引访问

选择您需要的概念,然后使用匹配的类。

关于.net - List (of T) 和 Collection(of T) 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/398903/

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