public class Flea : Animals {...}
var fleas = new Dictionary<int, Flea>();
public IReadOnlyDictionary<string, Animal> Animals => fleas.ToDictionary(pair => pair.Key, pair => (Animal)pair.Value);
问 是否有更有效的方法从跳蚤
获取动物
?
最佳答案
.NET 支持接口(interface)、委托(delegate)、泛型类型和数组中的协变。尽管使用 out
接口(interface)或类型必须指定它是协变的关键词。
你可以写
IEnumerable<Animal> animals=new List<Flea>();
或
var dict=new Dictionary<int,Flea>{
[1]=new Flea()
};
IEnumerable<Animal> animals=dict.Values;
这是有效的,因为 Dictionary.Values
返回 IEnumerable<Flea>
和 IEnumerable是协变的——它的定义是IEnumerable<out T>
.
KeyValuePair虽然不是协变的,这意味着使用它的类像 IDictionary<TKey,TValue>
和 IReadOnlyDictionary<TKey,TValue>
也不是。这是故意的。
由于您只需要从该字典中读取,您可以使用委托(delegate)或在 C# 7 及更高版本中使用本地函数来创建访问器方法。您可以将该函数传递给需要 Func<TKey,TValue>
的方法并使用它从字典中读取值。
如果您有一个方法需要基于 key 的访问,比方说:
void Process(Func<int,Animal> reader)
{
var value=reader(1);
}
在 C# 7 中你可以这样写:
var dict =...
Animal get(int key)=>dict[key];
Process(get);
这有点作弊,通过使用变量捕获来访问字典。
在 C# 7 之前,您将使用委托(delegate):
Func<int,Animal> get= key=>dict[key];
Process(get);
这可能看起来很奇怪,但这就是 LINQ 本身的工作方式,通过使用谓词和委托(delegate)而不是接口(interface)和包装器。
关于c# - 从 Dictionary<int, Fleas> 中高效获取 IReadOnlyDictionary<int, Animals>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56593508/