我需要创建一个字典,其中每个键可以映射到几个值

本文关键字:映射 几个 创建 一个 字典 | 更新日期: 2023-09-27 17:49:36

我想弄清楚如何创建类似于字典的东西,但每个键可以映射到几个值。

基本上,我需要的是能够在不知道每个键对应多少值的情况下为同一个键分配多个值。我还需要能够在多个场合向现有键添加值。如果我能检测到键+值组合是否已经存在,那就太好了。

程序应该如何工作的例子:

list.Add(1,5);
list.Add(3,6);
list.Add(1,7);
list.Add(5,4);
list.Add(1,2);
list.Add(1,5);

理想情况下应该生成如下表:

1: 5,7,2

3: 6

5: 4

在c#中是否有任何现有的结构,我可以为此使用,或者我必须实现我自己的类?实现这个类可能不是一个大问题,但我的时间有点紧,所以如果我能使用一些已经存在的东西就太好了。

我需要创建一个字典,其中每个键可以映射到几个值

快速解决

正如你已经提到的,Dictionary是最好的类型。您可以指定键类型和值类型来满足您的需求,在您的情况下,您需要一个int键和一个List<int>值。

这很容易创建:

Dictionary<int, List<int>> dictionary = new Dictionary<int, List<int>>();

接下来的挑战是如何添加记录,您不能简单地执行Add(key, value),因为这会导致重复键的冲突。因此,您必须首先检索列表(如果存在的话)并添加:

List<int> list = null;
if (dictionary.ContainsKey(key))
{
    list = dictionary[key];
}
else
{
    list = new List<int>();
    dictionary.Add(key, list);
}
list.Add(newValue);

首选解决方案

显然,每次要添加项时都要使用太多行,因此您可能希望将其扔到辅助函数中,或者我更倾向于创建自己的类来扩展Dictionary的功能。像这样:

class ListDictionary<T1, T2> : Dictionary<T1, List<T2>>
{
    public void Add(T1 key, T2 value)
    {
        if (this.ContainsKey(key))
        {
            this[key].Add(value);
        }
        else
        {
            List<T2> list = new List<T2>() { value };
            this.Add(key, list);
        }
    }
    public List<T2> GetValues(T1 key)
    {
        if(this.ContainsKey(key))
            return this[key];
        return null;
    }
}

然后你可以像你最初想要的那样简单地使用它:

ListDictionary<int, int> myDictionary = new ListDictionary<int, int>();
myDictionary.Add(1,5);
myDictionary.Add(3,6);
//...and so on

然后获取所需键的值列表:

List<int> keyValues = myDictionary.GetValues(key);
//check if NULL before using, NULL means the key does not exist
//alternatively you can check if the key exists with if (myDictionary.ContainsKey(key))

创建list的字典非常容易,例如

Dictionary<int, List<int>> dictionary = new Dictionary<int, List<int>>()

如果您已经创建了一个项目列表,并希望将它们按不同的键分成不同的组,那么可以使用Lookup类来实现相同的目的。

Dictionary<int, List<int>> dictionary = new Dictionary<int, List<int>>();
public void AddIfNotExistInDic(int key, int Value) {
    List<int> list = null;
    if (dictionary.ContainsKey(key)) {
        list = dictionary[key];
    }
    else {
        list = new List<int>();
        dictionary.Add(key, list);
    }
    if (!list.Contains(Value)) {
        list.Add(Value);
    }
}

您可以使用Dictionary<TKey, TValue>, TKey将是int, TValue将是List<int>,您可以在列表中添加尽可能多的元素,因为它自动增长。

Dictionary <int, List<int>> dic = new Dictionary<int, List<int>>();

访问值的方式会改变,例如,你可以在字典中添加元素,如

void AddToYourCustomDictionary(int key, int someValue)
{
   if(!dic.ContainsKey(key))
   {
      dic.Add(key, new List<int>());
       dic[key].Add(someValue);
   }
   else  
     dic[key].Add(someValue); //Adding element in existing key Value pair
}

访问字典中的元素键->值即列表,

Console.WriteLine(dic[key][indexOfList]);