我应该使用 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对于只读列表,您可以采用不同的方法。
List<string> list = new List<string>();
IReadOnlyList<string> roList = list;
var roList1 = new ReadOnlyList(list);
roList
和 roList1
都是只读的,但是如果你知道 roList
的原始类型是 List<string>
你可以转换它并修改集合。因此,第二种选择是更好的选择。需要指出的是,IEnumerable<string>
也是只读的,因为它不提供任何修改集合的方法(如果您不将其转换为原始类型)。
对于第二个问题,我们可以说任何List<T>
都会保留顺序。如果您不想提供查询列表的方法并使用OrderBy
,则无法使用派生自IEnumerable
的类。这是因为扩展方法。尽管如此,列表实例中的顺序仍然保留,但您可以重新查询。这并不意味着原始列表被触摸或修改。
【讨论】:
我会将“对于第二个问题,我们可以说任何 List以上是关于我应该使用 C# 中的哪些只读、保留顺序的集合来支持枚举?的主要内容,如果未能解决你的问题,请参考以下文章
我需要哪些 Qt 小部件才能使用只读、可滚动的项目列表(pyqt4)