将同步集合<T>转换为只读 同步只读集合<T>



我有一个List<T>,使用了AsReadOnly()方法并将结果存储在ReadOnlyCollection<T>中。现在我在线程中工作,需要做同样的事情,但用SynchronizedCollection<T>而不是List<T>,用SynchronizedReadOnlyCollection<T>而不是ReadOnlyCollection<T>

怎么做?

SynchronizedCollection<T> : IEnumerable<T>以来,您可以使用构造函数根据现有SynchronizedCollection<T>初始化SynchronizedReadOnlyCollection<T>的新实例

var readOnlyCollection = new SynchronizedReadOnlyCollection(synchronizedCollection.SyncRoot,
                                                            syncronizedCollection);

我也在考虑另一种方法。不同之处在于,使用第一种方法,您确实拥有SynchronizedCollection<T>的快照,但使用这种方法,您只有一个只读包装器(如果您向原始集合添加某些内容,它也将更新只读集合(

public static class SynchronizedCollectionExtension
{
    public static IReadOnlyCollection<T> AsReadOnly<T>(this SynchronizedCollection<T> value)
    {
        lock (value.SyncRoot)
        {
            // this call is not expensive as it is just a thin wrapper around the IList<T>
            return new ReadOnlyCollection<T>(value);
        }
    }
}
IReadOnlyCollection<int> readOnlyCollection = collection.AsReadOnly();

如果你的数据是可枚举的类型,那么只需将其传递给同步的类构造函数:

List<T> data = new List<T>();
var syncRoot = new object();
var syncCollection = new SynchronizedCollection<T>(syncRoot, data);
var synchronizedReadOnlyCollection = new SynchronizedReadOnlyCollection<T>(syncRoot, data);

相关内容

最新更新