我认为 IEnumerable
事物是您可以迭代的对象。
如果它们也是 ICollection
,你就会知道里面有多少元素。
如果它们甚至是 IList
s,您可以从特定索引中获取包含对象。
ReadOnlyCollection<T>
实现了 IList<T>
。所以 ReadOnlyList<T>
不会是一个更好的名字。
框架中是否有真正的 ReadOnlyCollection<T>
?
(所以我不需要IList来创建这样的只读包装器)
最佳答案
由于 ReadOnlyCollection<T>
只是 IList<T>
不允许修改列表的包装器,因此为 ICollection<T>
生成类似的包装器应该很容易:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
class MyReadOnlyCollection<T> : ICollection<T>, IEnumerable<T>, ICollection, IEnumerable
{
private ICollection<T> _collection;
private object _syncRoot;
public MyReadOnlyCollection(ICollection<T> collection)
{
_collection = collection;
}
public void Add(T item)
{
throw new NotSupportedException("Trying to modify a read-only collection.");
}
public void Clear()
{
throw new NotSupportedException("Trying to modify a read-only collection.");
}
public bool Contains(T item)
{
return _collection.Contains(item);
}
public void CopyTo(T[] array, int arrayIndex)
{
_collection.CopyTo(array, arrayIndex);
}
public int Count
{
get { return _collection.Count; }
}
public bool IsReadOnly
{
get { return true; }
}
public bool Remove(T item)
{
throw new NotSupportedException("Trying to modify a read-only collection.");
}
public IEnumerator<T> GetEnumerator()
{
return _collection.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return ((ICollection)_collection).GetEnumerator();
}
public void CopyTo(Array array, int index)
{
((ICollection)_collection).CopyTo(array, index);
}
public bool IsSynchronized
{
get { return false; }
}
public object SyncRoot
{
get
{
if (_syncRoot == null)
{
ICollection list = _collection as ICollection;
if (list != null)
{
_syncRoot = list.SyncRoot;
}
else
{
Interlocked.CompareExchange(ref _syncRoot, new object(), null);
}
}
return _syncRoot;
}
}
}
关于.net - 为什么 ReadOnlyCollection<T> 不是 ReadOnlyList<T>?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5976772/