What is collection semantics (in .NET)?
我需要在我自己的类中维护集合语义。你不能解释一下,集合的语义是什么?据我所知,它是一组必须在类中实现的接口。是真的吗?如果是,我必须在课堂上具体实现什么?为什么?这两个接口——ICollection和IEnumerable——足够了吗?还是这只是最需要的接口?
我正在使用本文作为帮助编写循环链接列表。
.NET中有许多集合类型,它们都有一些共同的行为,例如:
- 你可以用
foreach 来列举它们。 - 他们拥有
Count 财产。 - 您可以使用
Add 方法添加项目 - 等。。。
这种行为应该来自集合类型,您猜对了:它都在
IEnumerable 允许使用foreach 枚举类。ICollection 是一个IEnumerable 代表一个集合:- 它允许检索项目
Count 。 - 您可以从该托收中获得
Add /Remove /Clear 个项目。 - 集合可以是只读的,在这种情况下,
IsReadOnly 应返回true 。 - 还有其他一些辅助方法:
Contains 或CopyTo 。
- 它允许检索项目
IList 是一个ICollection 允许通过索引访问项目。- 它添加了一个索引器
- 一些与指数相关的函数:
Insert /RemoveAt 。 IndexOf
您应该实现哪个接口是语义问题:
通过定义一个函数来实现
让我们分解一个
1 2 3 | IEnumerable<T> sequence = ... // Whatever foreach (T item in sequence) DoSomething(item); |
这相当于以下内容:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | IEnumerator<T> enumerator = null; try { enumerator = sequence.GetEnumerator(); while (enumerator.MoveNext()) { T item = enumerator.Current; DoSomething(item); } } finally { if (enumerator != null) enumerator.Dispose(); } |
就记录而言,实现
当然,您可以使用
1 2 3 4 | public static IEnumerable<int> GetAnswer() { yield return 42; } |
这将创建一个私有类,它将为您实现
这是集合语义。
一些例子:
T[] —它实现ICollection ,即使你不能实现Add /Remove 。List HashSet —集合的好例子,但不是列表Dictionary —是的,那是ICollection 。> LinkedList ObservableCollection
循环链接列表并非如此,因为它不仅需要O(N)时间,而且一开始就没有任何有意义的索引。
一些例子:
T[] List ObservableCollection
请注意,例如,
我应该提到在.NET 4.5中有只读的等价物: