我应该使用 C# 中的哪些只读、保留顺序的集合来支持枚举?

Posted

技术标签:

【中文标题】我应该使用 C# 中的哪些只读、保留顺序的集合来支持枚举?【英文标题】:What read-only, order-preserving collection in C# should I use to support enumeration? 【发布时间】:2016-08-23 18:10:13 【问题描述】:

我对数据结构只有两个要求:

只读, 保留顺序(我想始终按特定顺序列举它)。

我知道IReadOnlyList 确实保持秩序。我可以使用它,但我不需要索引。这意味着我应该使用IReadOnlyCollection。不幸的是,我找不到它保持秩序的信息。

你知道吗?

【问题讨论】:

msdn.microsoft.com/en-us/library/ms132474%28v=vs.110%29.aspx 为什么不能使用IEnumerable<T>?正是具体的集合保证了订购。 @roryap 提到它是IList 的包装器。我不确定它是否相当于说它保留了秩序...... 它确实保持秩序。 IEnumerable 是一个提供枚举方法的接口。它不能保证顺序,如果你持有一个 IEnumerable 如果你关心保持顺序,你不应该依赖底层的具体类型。您应该要求一个 IList。对于只读, IReadOnlyList 可以。 【参考方案1】:

对于只读列表,您可以采用不同的方法。

List<string> list = new List<string>();
IReadOnlyList<string> roList = list;
var roList1 = new ReadOnlyList(list);

roListroList1 都是只读的,但是如果你知道 roList 的原始类型是 List&lt;string&gt; 你可以转换它并修改集合。因此,第二种选择是更好的选择。需要指出的是,IEnumerable&lt;string&gt; 也是只读的,因为它不提供任何修改集合的方法(如果您不将其转换为原始类型)。

对于第二个问题,我们可以说任何List&lt;T&gt; 都会保留顺序。如果您不想提供查询列表的方法并使用OrderBy,则无法使用派生自IEnumerable 的类。这是因为扩展方法。尽管如此,列表实例中的顺序仍然保留,但您可以重新查询。这并不意味着原始列表被触摸或修改。

【讨论】:

我会将“对于第二个问题,我们可以说任何 List 保留顺序”更改为“对于第二个问题,我们可以说任何 List 都保留索引处的项目插入”以避免混淆索引和顺序的概念。

以上是关于我应该使用 C# 中的哪些只读、保留顺序的集合来支持枚举?的主要内容,如果未能解决你的问题,请参考以下文章

c# 正则表达式捕获

我需要哪些 Qt 小部件才能使用只读、可滚动的项目列表(pyqt4)

C#枚举中的保留关键字

unity protobuf使用repeated字段转c#文件后List只读问题

是否可以将集合视图保留在另一个集合视图中?

在C#中序列化和反序列化之间保留xml元素的顺序