要创建空序列,可以使用以下方法
var empty = Enumerable.Empty<string> ();
有没有一个等效的方法可以像这样简单地创建一个空字典?
vyu0f0g11#
回到2019年,有一种方法可以实现这一点,使用:
ImmutableDictionary<TKey, TValue>.Empty
更多信息可以在这里找到(最后几个职位):https://github.com/dotnet/corefx/issues/25023
qco9c6ql2#
不,没有对等的...Enumerable.Empty<T>()的作用是返回一个空数组的“缓存”示例,这样就可以避免创建新数组(return new T[0];)的开销。不能将其转换为IDictionary<TKey, TValue>或Dictionary<TKey, TValue>等非只读结构,因为返回的示例可能会在以后被修改,从而使目的无效...
Enumerable.Empty<T>()
return new T[0];
IDictionary<TKey, TValue>
Dictionary<TKey, TValue>
jtw3ybtb3#
new Dictionary<string, string>()有什么问题?
new Dictionary<string, string>()
iklwldmw4#
我假设(至少5年后的现在)* empty dictionary * 真的意味着 * emptyread-onlydictionary *,这个结构和空的可枚举序列一样有用,例如,你可能有一个配置类型,它有一个dictionary属性(想想JSON),一旦被配置就不能被修改:
public class MyConfiguration { public IReadOnlyDictionary<string, string> MyProperty { get; set; } }
但是,如果该属性从未被配置过,那么MyProperty就是null。避免出现意外NullReferenceException的一个好办法是使用空字典初始化该属性:
MyProperty
null
NullReferenceException
public class MyConfiguration { public IReadOnlyDictionary<string, string> MyProperty { get; set; } = new Dictionary<string, string>(); }
缺点是每次分配MyConfiguration都需要分配一个空字典,为了避免这种情况,你需要类似于Enumerable.Empty<T>()的东西,也就是一个缓存的空只读字典。有两种方法可以实现这一点。第一种是对System.Collections.Immutable进行依赖。ImmutableDictionary<TKey, TValue>实现了IReadOnlyDictionary<TKey, TValue>,并且它有一个Empty字段供您使用:
MyConfiguration
ImmutableDictionary<TKey, TValue>
IReadOnlyDictionary<TKey, TValue>
Empty
IReadOnlyDictionary<string, string> empty = ImmutableDictionary<string, string>.Empty;
或者你可以实现你自己的空只读字典,类似于Enumerable.Empty<T>()和Array.Empty<T>()。注意空值不再是一个字段,类也不是泛型的。相反,它是一个泛型方法。这需要两个类。第一类是"隐藏的",可以是内部的:
Array.Empty<T>()
internal static class EmptyReadOnlyDictionary<TKey, TValue> { public static readonly IReadOnlyDictionary<TKey, TValue> Instance = new Dictionary<TKey, TValue>(); }
第二个类使用第一个类,但将其隐藏在IReadOnlyDictionary<TKey, TValue>接口之后:
public static class ReadOnlyDictionary { public static IReadOnlyDictionary<TKey, TValue> Empty<TKey, TValue>() => EmptyReadOnlyDictionary<TKey, TValue>.Instance; }
用法:
IReadOnlyDictionary<string, string> empty = ReadOnlyDictionary.Empty<string, string>();
对于这两种解决方案,TKey和TValue的每个不同组合都只有一个空字典示例。
TKey
TValue
wfypjpf45#
在.NET 8 preview中,可以通过以下方式创建一个空的Dictionary:
Dictionary
ReadOnlyDictionary<TKey, TValue>.Empty;
这种方法不使用内存,并且比使用new关键字启动它要快。
new
hfwmuf9z6#
当键和值具有相同的类型时(例如:字符串):
Enumerable.Empty<string>().ToDictionary(x=>x, x=>x)
rpppsulh7#
Enumerable.Empty<KeyValuePair<string, object>>().ToDictionary(kvp => kvp.Key, kvp => kvp.Value)
7条答案
按热度按时间vyu0f0g11#
回到2019年,有一种方法可以实现这一点,使用:
更多信息可以在这里找到(最后几个职位):https://github.com/dotnet/corefx/issues/25023
qco9c6ql2#
不,没有对等的...
Enumerable.Empty<T>()
的作用是返回一个空数组的“缓存”示例,这样就可以避免创建新数组(return new T[0];
)的开销。不能将其转换为
IDictionary<TKey, TValue>
或Dictionary<TKey, TValue>
等非只读结构,因为返回的示例可能会在以后被修改,从而使目的无效...jtw3ybtb3#
new Dictionary<string, string>()
有什么问题?iklwldmw4#
我假设(至少5年后的现在)* empty dictionary * 真的意味着 * emptyread-onlydictionary *,这个结构和空的可枚举序列一样有用,例如,你可能有一个配置类型,它有一个dictionary属性(想想JSON),一旦被配置就不能被修改:
但是,如果该属性从未被配置过,那么
MyProperty
就是null
。避免出现意外NullReferenceException
的一个好办法是使用空字典初始化该属性:缺点是每次分配
MyConfiguration
都需要分配一个空字典,为了避免这种情况,你需要类似于Enumerable.Empty<T>()
的东西,也就是一个缓存的空只读字典。有两种方法可以实现这一点。第一种是对System.Collections.Immutable进行依赖。
ImmutableDictionary<TKey, TValue>
实现了IReadOnlyDictionary<TKey, TValue>
,并且它有一个Empty
字段供您使用:或者你可以实现你自己的空只读字典,类似于
Enumerable.Empty<T>()
和Array.Empty<T>()
。注意空值不再是一个字段,类也不是泛型的。相反,它是一个泛型方法。这需要两个类。第一类是"隐藏的",可以是内部的:
第二个类使用第一个类,但将其隐藏在
IReadOnlyDictionary<TKey, TValue>
接口之后:用法:
对于这两种解决方案,
TKey
和TValue
的每个不同组合都只有一个空字典示例。wfypjpf45#
在.NET 8 preview中,可以通过以下方式创建一个空的
Dictionary
:这种方法不使用内存,并且比使用
new
关键字启动它要快。hfwmuf9z6#
当键和值具有相同的类型时(例如:字符串):
rpppsulh7#