如何创建一个空的IReadOnlyCollection

i3a*_*non 14 .net c# readonly-collection multi-value-dictionary

我正在为MultiValueDictionary创建一个扩展方法来封装频繁的ContainsKey检查,我想知道什么是创建空的最佳方法IReadOnlyCollection

我一直使用至今的new List<TValue>(0).AsReadOnly(),但必须有一个更好的办法,一个equivilant来IEnumerableEnumerable.Empty

public static IReadOnlyCollection<TValue> GetValuesOrEmpty<TKey, TValue>(this MultiValueDictionary<TKey, TValue> multiValueDictionary, TKey key)
{            
    IReadOnlyCollection<TValue> values;
    return !multiValueDictionary.TryGetValue(key, out values) ? new List<TValue>(0).AsReadOnly() : values;
}
Run Code Online (Sandbox Code Playgroud)

i3a*_*non 20

编辑:新的.Net 4.6添加了一个API来获取一个空数组:Array.Empty<T>并且数组实现IReadOnlyCollection<T>.这也减少了分配,因为它只创建一次实例:

IReadOnlyCollection<int> emptyReadOnlyCollection = Array.Empty<int>();
Run Code Online (Sandbox Code Playgroud)

我最终做的是模仿Enumerable.Empty使用的实现new TElement[0]:

public static class ReadOnlyCollection
{
    public static IReadOnlyCollection<TResult> Empty<TResult>()
    {
        return EmptyReadOnlyCollection<TResult>.Instance;
    }

    private static class EmptyReadOnlyCollection<TElement>
    {
        static volatile TElement[] _instance;

        public static IReadOnlyCollection<TElement> Instance
        {
            get { return _instance ?? (_instance = new TElement[0]); }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

IReadOnlyCollection<int> emptyReadOnlyCollection = ReadOnlyCollection.Empty<int>();
Run Code Online (Sandbox Code Playgroud)


Dou*_*oug 8

return new List<XElement>().AsReadOnly();