gpt4 book ai didi

c# - 使用多个键创建字典并使用其中一个键获取值

转载 作者:行者123 更新时间:2023-12-04 08:32:45 26 4
gpt4 key购买 nike

我想创建一个字典,它有一个多个键,当我想只使用一个或多个键获取值时。

我试过了:

        Dictionary<Tuple<int, string>, string> dictionary = new Dictionary<Tuple<int, string>, string>();

var Key =new Tuple<int,string>(1,"I1");
var Value = "this is a value";

dictionary.Add(Key, Value);

当我尝试从字典中获取值时 我必须/应该输入所有键

像这样:

MessageBox.Show($"{dictionary[new Tuple<int, string>(1,"I1")]}");

但是当我尝试仅使用这样一个键来获取值时

MessageBox.Show($"{dictionary[new Tuple<int, string>(1,"")]}");

我得到了错误,我知道这个错误的发生是因为 dictionary 需要完整的存在键来返回一个值。

所以请任何人知道如何创建具有多个字典,以及何时仅使用一个检索值>更多所有 keys ?

最佳答案

.NET 中的字典预期具有接近 O(1) 的查找时间。为此,他们使用了键对象的 GetHashCode()Equals() 方法。生成的哈希码用于将字典的内容划分为多个分区。当您查找一个项目时,分区是使用哈希码标识的,该分区中具有匹配哈希码*的所有项目都将与您使用 Equals() 查找的键进行比较方法。

在这里,您正在尝试为每个对象创建一个包含两个键的字典。您正在使用 Tuple 来制作一把 key 。 TupleGetHashCode() 结果是基于它的两个值的,所以如果您只想查找值的一半,字典的性能就会降低 key 。您需要遍历整个字典,比较每个单独的项目,使它比列表好一点。

一个解决方案是制作一个具有 string->int 键查找的字典,然后另一个字典只是 int->string。这在使用字符串键时需要两次查找,但这可能是一个很好的解决方案。

例子:

Dictionary<string, int> stringKeyToIntKey = new Dictionary<string, int>();
Dictionary<int, string> intKeyDict = new Dictionary<int, string>();

intKeyDict[1] = "Test";
stringKeyToIntKey["I1"] = 1;

Console.WriteLine(intKeyDict[1]);
Console.WriteLine(intKeyDict[stringKeyToIntKey["I1"]]);

添加方法可能如下所示:

public void AddEntry(int intKey, string stringKey, string value)
{
intKeyDict[intKey] = value;
stringKeyToIntKey[stringKey] = intKey;
}

您可以包装 TryGetValue 以使生活更轻松:

public bool TryGetValue(string stringKey, out string value)
{
value = null;
return stringKeyToIntKey.TryGetValue(stringKey, out int intKey) && intKeyDict.TryGetValue(intKey, out value);
}

删除看起来像这样:

public void DeleteEntry(string stringKey)
{
if (stringKeyToIntKey.TryGetValue(stringKey, out int intKey))
{
intKeyDict.Remove(intKey);
stringKeyToIntKey.Remove(stringKey);
}
}

您必须确保同时从两个词典中添加和删除项目。当您向 intKey 添加项时,您需要将相应的键映射添加到 stringKeyToIntKey

或者,你可以有两个字典:一个有一个字符串键,一个有一个整型键,每个都有相同的值。同样,您必须同时添加和删除项目,并且还必须同时更新两者中的值。

例子:

Dictionary<string, string> stringKeyDict = new Dictionary<string, string>();
Dictionary<int, string> intKeyDict = new Dictionary<int, string>();

stringKeyDict["I1"] = "hello";
intKeyDict[1] = "hello";

Console.WriteLine(stringKeyDict["I1"]);
Console.WriteLine(intKeyDict[1]);

这是我最喜欢的方法,其中值是类实例,因为两个字典都将引用我的项目的相同类实例,因此对这些实例的属性的更改将反射(reflect)在两者中。然而,对于字符串,第一个选项可能更好。

* 哈希码不是唯一的,多个对象可能具有相同的哈希码,即使它们的值不同也是如此

关于c# - 使用多个键创建字典并使用其中一个键获取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64944140/

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