gpt4 book ai didi

c# - IDictionary> 上的单一扩展方法

转载 作者:太空狗 更新时间:2023-10-29 23:46:27 24 4
gpt4 key购买 nike

我正在尝试编写一个扩展方法来转换 IDictionary<K, S<V>>持有任何类型的集合/序列( S<V> )到 ILookup<K, V>在这些情况下,这是更合适的数据结构。这意味着我希望我的扩展能够处理不同的 S类型和接口(interface):

  • IDictionary<K, IEnumerable<V>>
  • IDictionary<K, ICollection<V>>
  • IDictionary<K, List<V>>

等理想情况下,我不想为每种可能的集合类型编写单独的实现,我希望类型推断能够完成它的工作。

我试过的是:

public static ILookup<TKey, TValue>ToLookup<TKey, TCollection, TValue>(
this IDictionary<TKey, TCollection> dictionary)
where TCollection : IEnumerable<TValue>

但是它没有TValue在参数列表中,因此类型推断无法弄清楚 - 我得到“无法从用法推断方法 ToLookup 的类型参数”。

除了添加假 TValue 之外,它是否有可能以其他方式工作? -方法的类型参数?

预期用法示例

我希望以上所有调用都是可能的,并导致调用我的单一扩展方法:

var dictOfIEnumerables = new Dictionary<int, IEnumerable<int>>();
var lookupFromIEnumerables = dictOfIEnumerables.ToLookup();

var dictOfICollections = new Dictionary<int, ICollection<int>>();
var lookupFromICollections = dictOfICollections.ToLookup();

var dictOfLists = new Dictionary<int, List<int>>();
var lookupFromLists = dictOfLists.ToLookup();

最佳答案

因为所有集合都实现了IEnumerable<T> , 我们可以用它代替 TCollection类型参数。不幸的是类型推断并不知道这一点。这是我写的代码:

public static ILookup<TKey, TValue> ToLookup<TKey, TValue>
(this IDictionary<TKey, IEnumerable<TValue>> dict)
{
return dict.SelectMany(p => p.Value.Select
(v => new KeyValuePair<TKey, TValue>(p.Key, v)))
.ToLookup(p => p.Key, p => p.Value);
}

似乎没有办法使类型推断起作用,但如果您强制转换字典,此方法将起作用:

((IDictionary<int, IEnumerable<int>>)dictOfLists).ToLookup()

您还可以将列表添加到 IEnumerables 的字典中,并在需要时将它们转换回去。

关于c# - IDictionary<K, IEnumerable/IList/ICollection<V>> 上的单一扩展方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17330173/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com