使用Linq to对象,如何轻松创建〈string,string>空字典?

mm9b1k5b  于 2023-02-27  发布在  其他
关注(0)|答案(7)|浏览(154)

要创建空序列,可以使用以下方法

var empty = Enumerable.Empty<string> ();

有没有一个等效的方法可以像这样简单地创建一个空字典?

vyu0f0g1

vyu0f0g11#

回到2019年,有一种方法可以实现这一点,使用:

ImmutableDictionary<TKey, TValue>.Empty

更多信息可以在这里找到(最后几个职位):https://github.com/dotnet/corefx/issues/25023

qco9c6ql

qco9c6ql2#

不,没有对等的...
Enumerable.Empty<T>()的作用是返回一个空数组的“缓存”示例,这样就可以避免创建新数组(return new T[0];)的开销。
不能将其转换为IDictionary<TKey, TValue>Dictionary<TKey, TValue>等非只读结构,因为返回的示例可能会在以后被修改,从而使目的无效...

jtw3ybtb

jtw3ybtb3#

new Dictionary<string, string>()有什么问题?

iklwldmw

iklwldmw4#

我假设(至少5年后的现在)* empty dictionary * 真的意味着 * emptyread-onlydictionary *,这个结构和空的可枚举序列一样有用,例如,你可能有一个配置类型,它有一个dictionary属性(想想JSON),一旦被配置就不能被修改:

public class MyConfiguration
{
    public IReadOnlyDictionary<string, string> MyProperty { get; set; }
}

但是,如果该属性从未被配置过,那么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字段供您使用:

IReadOnlyDictionary<string, string> empty = ImmutableDictionary<string, string>.Empty;

或者你可以实现你自己的空只读字典,类似于Enumerable.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>();

对于这两种解决方案,TKeyTValue的每个不同组合都只有一个空字典示例。

wfypjpf4

wfypjpf45#

在.NET 8 preview中,可以通过以下方式创建一个空的Dictionary

ReadOnlyDictionary<TKey, TValue>.Empty;

这种方法不使用内存,并且比使用new关键字启动它要快。

hfwmuf9z

hfwmuf9z6#

当键和值具有相同的类型时(例如:字符串):

Enumerable.Empty<string>().ToDictionary(x=>x, x=>x)
rpppsulh

rpppsulh7#

Enumerable.Empty<KeyValuePair<string, object>>().ToDictionary(kvp => kvp.Key, kvp => kvp.Value)

相关问题