i3a*_*non 14 .net c# readonly-collection multi-value-dictionary
我正在为MultiValueDictionary创建一个扩展方法来封装频繁的ContainsKey检查,我想知道什么是创建空的最佳方法IReadOnlyCollection?
我一直使用至今的new List<TValue>(0).AsReadOnly(),但必须有一个更好的办法,一个equivilant来IEnumerable的Enumerable.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)
| 归档时间: |
|
| 查看次数: |
6113 次 |
| 最近记录: |