【问题标题】:How can I map multipul lists to one key on C#?如何将多个列表映射到 C# 上的一个键?
【发布时间】:2021-09-07 09:32:55
【问题描述】:

我需要将一个字符串(句子)映射到两个列表(相似的句子索引和每个列表中的不同单词)。 通过使用“字典”,我必须使用 2 个字典来保存每个列表。

还有其他方法可以将字符串保存为 int[] 和 string[] 的键吗?

这就是现在的样子:

Dictionary<string, int[]> similarSentences = new Dictionary<string, int[]>();
Dictionary<string, string[]> changes = new Dictionary<string, string[]>();

我想要这样的东西:

Dictionary<string, int[],string[]> similarSentencesAndChanges = new Dictionary<string, int[],string[]>();

谢谢!

【问题讨论】:

  • 虽然您可以使用元组,但我建议您创建自己的类型作为字典的值部分 - 您的类型将包含两个数组。

标签: c# dictionary


【解决方案1】:

你可以使用元组:

Dictionary<string,(int[] Similar, string[] Changes)> similarSentencesAndChanges = new Dictionary<string,(int[] Similar, string[] Changes)>();

然后你可以像这样访问它:

var someKey = "somekey";
(int[] similar, string[] changes) = similarSentencesAndChanges[someKey];

但是,根据您的计划,随机使用元组是一种不好的做法,您最好创建一个包含两个集合的类。

class SentenceData
{
    public int[] Similar {get;}

    public string[] Changes {get;}
}

然后,将您的字典设为Dictionary&lt;string, SentenceData&gt;

这具有允许在代码的其他部分重用对象的额外好处。此外,在后期向对象添加属性不会涉及潜在地重写大部分代码。

【讨论】:

    【解决方案2】:

    假设您可以使用元组,您可以为通用 Dictionary&lt;TKey, TValue&gt; 类型创建一个扩展方法,该方法返回一个包含元组值的字典...

    public static Dictionary<TKey, (TValue, TValue2)> Combine<TKey, TValue, TValue2>(this Dictionary<TKey, TValue> a, Dictionary<TKey, TValue2> b)
    {
        return a.Keys.Union(b.Keys).ToDictionary(x => x, x => (
            a.ContainsKey(x) ? a[x] : default,
            b.ContainsKey(x) ? b[x] : default
        ));
    }
    

    示例用法...

    var similarSentencesAndChanges = similarSentences.Combine(changes);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-04
      • 2014-06-07
      • 2021-09-11
      • 2018-05-05
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      相关资源
      最近更新 更多