gpt4 book ai didi

c# - 灵活使用 IDictionary(带接口(interface))

转载 作者:太空宇宙 更新时间:2023-11-03 21:09:32 25 4
gpt4 key购买 nike

我正在尝试灵活地使用 IDictionary我的一种方法中的接口(interface),但由于转换方面的限制(请参阅 C# type conversion: Explicit cast exists but throws a conversion error? ),它的使用对我来说非常有限。我想知道是否有一些解决方法。

这是我的具体问题:我有一个采用映射的方法,该映射将每个键映射到其他键的 IEnumerable。它还需要一个键作为输入。它所做的是找到关于映射的给定键的闭包集/外壳:

public static ISet<T> GetClosureSet(T element, IDictionary<T, IEnumerable<T>> elementToCollectionMap)
{
ISet<T> closure = new HashSet<T>();
closure.Add(element);
closure.UnionWith(elementToCollectionMap[element]);

int count = 0;
while (count != closure.Count)
{
count = closure.Count;
foreach (T elem in new HashSet<T>(closure))
closure.UnionWith(elementToCollectionMap[elem]);
}

return closure;
}

此类映射的示例 IDictionary<double, IEnumerable<double>> :

1 -> [2, 3, 4]
2 -> [3, 7]
3 -> [3]
4 -> [] // empty enumerable, i.e. array of length 0
5 -> [6]
6 -> [6]
7 -> []

如果我把 key 1并将此映射到我的方法中,我将得到 [1, 2, 3, 4, 7] : 第一个 1及其图像[2, 3, 4]一起放入闭集。然后是 1 的图片, 2 , 3 , 4也添加了,所以我们得到 7以及(作为 2 的图像元素)。在下一步中,1 的所有图像, 2 , 3, 4 , 7已添加,但它们已经在那里。因此,该方法结束并返回。

如您所见,这是一个非常抽象的方法,它不关心值到底是什么。它只需要值为 IEnumerable<T>能够调用UnionWith .

但现在我希望能够在我有从键到某种键集合的映射时使用该方法!

我在我的代码中有一些我定义的地方

IDictionary<MyType, HashSet<MyType>> foo = new Dictionary<MyType, HashSet<MyType>>();

IDictionary<MyType, List<MyType>> bar = new Dictionary<MyType, List<MyType>>();

并需要它们真正成为 IDictionary<MyType, HashSet<MyType>>IDictionary<MyType, List<MyType>>因为我需要 HashSet 的一些功能和 ListIEnumerable 提供的以外.只是后来我想关闭。但是现在,我不能给foobar作为我的方法的输入 - 我需要从中创建新的字典以适应类型。

关于如何解决问题的任何想法(我不认为“创建一个新字典以适应类型”是一种解决方案)?

最佳答案

解决此问题的最佳方法是对您的公共(public) API 稍作更改。从根本上讲,GetClosureSet 不需要将所有键映射到该键的一系列值,它只需要一个操作来获取给定键的所有值:

public static ISet<T> GetClosureSet(
T element,
Func<T, IEnumerable<T>> childSelector)

调用者可以通过多种方式实现该方法,其中一种方式是在他们拥有的字典中执行查找。这实际上使您的方法更更通用,因为它允许您对不同类型的图执行此操作,这些图以完全不同的方式存储它们的节点,例如“节点”对象,每个对象都已经引用了 child 的集合,而不是存储在字典中的图形。

关于c# - 灵活使用 IDictionary(带接口(interface)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38639459/

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