C#字典:每个值多个KEYS

时间:2013-09-30 20:12:35

标签: c# .net map

我正在寻找一种方法来获得多个,只需一个。是的,我已经使用了搜索功能,但大多数答案都是相反的方向(多个每个),但我希望相反。

这背后的原因是我希望每个“主”ID保留多个Item-ID(它是Bot),并且将这些多个ID扔到一个值中太慢而无法修改(查找一个值= >循环所有主要ID并获取每个值,然后检查该ID是否存在)。

示例

Key 1 => Value
Key 2 => Value
Key 3 => Value
Key 4 => Value
Key 5 => Value 2

寻找价值应该返回:关键1-4,而不是5

所以我正在寻找一种更容易实现的方法 - 就像我上面所说的那样。

任何人都知道这是否可行以及如何做到这一点? 提前谢谢。

5 个答案:

答案 0 :(得分:7)

修改 看看你的编辑,你看起来好像已经设计了这个Dictionary ...你的键应该是匹配值,而不是匹配键的值。

你可以做一些事情,比如创建一个将外键映射到内键的字典,然后使用内键来索引第二个字典。

示例:

var outer = new Dictionary<int, Guid> {
  { 1, GuidA },
  { 2, GuidA },
  { 3, GuidA },
  { 4, GuidA },
  { 5, GuidB }
};
var inner = new Dictionary<Guid, Value> {
  { GuidA, Value1 },
  { GuidB, Value2 }
};

您可以按以下方式访问它:value = outer[inner[key]]

答案 1 :(得分:3)

反过来做字典并将值作为项目列表。

如果例如Value是一个字符串并且Key 1-4是整数,那么您的字典可能类似于:

var theDictionary = new Dictionary<string, List<int>>();

Value检索theDictionary["Value"]将返回包含1,2,3和4的整数列表。

编辑 - 添加了示例:

var theDictionary = new Dictionary<string, List<string>>
    {
        {"Value", new List<string> {"Key 1", "Key 2", "Key 3", "Key 4", "Key 5",}},
        {"Value2", new List<string> {"Key 5", "Key 2"}}
    };

var oneToFour = theDictionary["Value"];

答案 2 :(得分:3)

你可能会过度思考你的问题。密钥必须是唯一的才能对查找操作有用。值不必是唯一的。多个键可以指向相同的值而不会导致问题。

答案 3 :(得分:1)

1)Servy绝对正确。如果你正在搜索除了键之外的任何东西......如果你想要检索除了相应值之外的任何东西......那么肯定是错的。在所有条件相同的情况下,你可能不想要字典。

2)根据你所说的,也许更好的集合类型可能是List。具体来说,是名称/值对的列表。

示例:

List<string> NVList = new List<string>();
NVList.Add("color=blue");
...

3)请注意.Net有一个专门的“NameValueCollection”类,可能是 IDEAL

答案 4 :(得分:0)

假设您已经有了初始字典(将键映射到值),您可以使用一些Linq将其转换为反向字典,而无需手动创建反向字典。

var newDict = initialDict.Select(x=>x.Value).Distinct().ToDictionary(x=>x, x=> initialDict.Where(kvp=>kvp.Value == x).Select(kvp=>kvp.Key));

从原始字典中选择不同的originalValues,并将其用作newKeys。您的newValues是映射到每个originalKeys / originalValue的{​​{1}}的一组。

示例:https://dotnetfiddle.net/dhwUSC

给出

的初始字典
newKey

以上函数返回

var initialDict = new Dictionary<int, string>{
        {1, "Value"},
        {2, "Value"},
        {3, "Value"},
        {4, "Value"},
        {5, "Value2"}
    };