【问题标题】:C# Dictionary: Multiple KEYS per ValueC# 字典:每个值有多个键
【发布时间】:2013-09-30 20:12:35
【问题描述】:

我正在寻找一种通过单个 获取多个 的方法。是的,我已经使用了搜索功能,但大多数答案都是相反的方向(每个 key 有多个 values),但我想要相反的方向。

这背后的原因是,我想为每个“主”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

所以我正在寻找一种更容易做到这一点的方法——就像我上面所说的那样。

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

【问题讨论】:

  • 你可以创建一个复合键(它可以是一个对象,你知道的),但是通过这样的键搜索将不是最优的
  • 您能否展示一些示例输入/输出,也许您想对该数据结构调用哪些操作。
  • 你到底想在这里强制执行什么?鉴于您的示例,您所说的 Value 实际上是键,而您的实际值只需是一个集合。
  • 听起来您只是将键称为值,将值称为键,这让您感到困惑,并且您真的只想每个键有多个值。你说,“寻找价值”。您不搜索值,而是搜索键。如果您正在搜索“价值”,那么这应该是关键,而不是价值。
  • 在上面添加了一个例子,希望能显示出来。

标签: c# .net map


【解决方案1】:

你可能想多了你的问题。键必须是唯一的才能对查找操作有用。值不需要是唯一的。多个键可以指向同一个值而不会引起问题。

【讨论】:

    【解决方案2】:

    反过来做字典,使值成为项目列表。

    如果例如Value 是一个字符串并且Key 1-4 是整数,那么你的字典可能看起来像:

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

    通过theDictionary["Value"] 检索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"];
    

    【讨论】:

    • 我认为那对我来说仍然是最简单的变体。谢谢大家!
    • 反过来怎么样...给key 获取value
    【解决方案3】:

    编辑: 查看您的编辑,看起来您确实设计了这个 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]]

    【讨论】:

      【解决方案4】:

      1) Servy 是绝对正确的。如果您正在搜索除键之外的任何内容......并且如果您试图检索除相应值之外的任何内容......那么肯定有问题。在所有条件相同的情况下,您可能不需要字典。

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

      示例:

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

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

      【讨论】:

        【解决方案5】:

        假设您已经有了初始字典(将键映射到值),您可以使用一些 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/newKey


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

        给定一个初始字典

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

        以上函数返回

        Value: {1, 2, 3, 4}
        Value2: {5}
        

        【讨论】:

          猜你喜欢
          • 2010-12-02
          • 1970-01-01
          • 1970-01-01
          • 2016-11-05
          • 2014-05-21
          • 2011-06-09
          • 2021-12-24
          • 1970-01-01
          • 2022-11-26
          相关资源
          最近更新 更多