Using Linq to objects, how to create an empty dictionary of <string, string> easily?
要创建空序列,请使用以下命令
1 | var empty = Enumerable.Empty<string> (); |
是否有一个等价物可以如此容易地创建一个空字典?
不,没有等价物…
您不能将其转换为非只读结构,如
我假设(至少5年后的现在)空字典实际上意味着空的只读字典。这个结构和空的可枚举序列一样有用。例如,您可能有一个配置类型,该配置类型有一个字典属性(想想json),一旦配置了该属性,就无法对其进行修改:
1 2 3 4 | public class MyConfiguration { public IReadOnlyDictionary<string, string> MyProperty { get; set; } } |
但是,如果从未配置该属性呢?那么,
1 2 3 4 5 | public class MyConfiguration { public IReadOnlyDictionary<string, string> MyProperty { get; set; } = new Dictionary<string, string>(); } |
。
缺点是,每个
实现这一点有两种方法。第一种方法是依赖System.Collections.Immutable。
1 | IReadOnlyDictionary<string, string> empty = ImmutableDictionary<string, string>.Empty; |
或者,您可以实现自己的空只读字典,类似于
第一个类是"隐藏"的,可以是内部类:
1 2 3 4 5 | internal static class EmptyReadOnlyDictionary<TKey, TValue> { public static readonly IReadOnlyDictionary<TKey, TValue> Instance = new Dictionary<TKey, TValue>(); } |
。
第二个类使用第一个类,但将其隐藏在
1 2 3 4 5 | public static class ReadOnlyDictionary { public static IReadOnlyDictionary<TKey, TValue> Empty<TKey, TValue>() => EmptyReadOnlyDictionary<TKey, TValue>.Instance; } |
。
用途:
1 | IReadOnlyDictionary<string, string> empty = ReadOnlyDictionary.Empty<string, string>(); |
对于这两种解决方案,对于
回到2019年,有一种方法可以做到这一点,使用:
1 | ImmutableDictionary<TKey, TValue>.Empty |
。
更多信息可以在这里找到(最后几篇文章):https://github.com/dotnet/corefx/issues/25023
当键和值具有相同类型(例如:字符串)时:
1 | Enumerable.Empty<string>().ToDictionary(x=>x, x=>x) |
1 | Enumerable.Empty<KeyValuePair<string, object>>().ToDictionary(kvp => kvp.Key, kvp => kvp.Value) |
号