【问题标题】:C# dictionary with multiple values how to [duplicate]具有多个值的C#字典如何[重复]
【发布时间】:2015-11-27 02:17:46
【问题描述】:

我正在努力弄清楚如何修改此字典,以便它可以为一个键(如果需要)接受两个值,而不仅仅是一个值。在大多数情况下,一个键只有一个值,但偶尔会有两个值,应用程序不喜欢这样。相反,它会抛出“已添加相同键的项目”异常。在我仍在学习的过程中,我一直在网上搜索有关字典的信息,但一直在努力,并认为我可能会在这里要求有人为我指明正确的方向。从我读过的内容来看,我应该使用动态或元组,但我在使用下面的代码实现它时遇到了麻烦。我知道这个网站上有类似的问题和答案,但我很难将这些答案与这段代码联系起来。非常感谢一个更具体的例子。

 public List<ImportItem<T>> ProcessReportResult(CSVTable resultData, ICollection<ImportItem<T>> data, Func<T, string> keyFilter)
    {
        WriteLog("{1}{0} records found.{1}", resultData.Rows.Length, Environment.NewLine);

        //key = Order Number; value = Order ID
        var idDictionary = resultData.Rows.Select((row => row.Split(','))).ToDictionary(id => id[0], id => id[1]);

        idDictionary.ForEach(id => WriteLog("Input Id = {0} - Matching record Id = {1}", id.Key, id.Value));

        var processList = data.Where(item => idDictionary.ContainsKey(keyFilter(item.DataItem))).ToList();

        processList.ForEach(item => item.Id = idDictionary[keyFilter(item.DataItem)]);


        return processList;
    }

【问题讨论】:

  • 对值使用某种集合(数组/列表)
  • 您可以使用具有两个属性的类作为字典的值。我认为不要使用元组,因为它是不可变的。 Dictionary 字典 = new Dictionary();
  • @booksguy,使用.ToLookup 而不是.ToDictionary
  • 感谢 Eser 的建议,您能举例说明一下吗?我现在正在查看 ToLookup,我认为它应该可以工作。只需要弄清楚如何实现它。我还是个n00b

标签: c# dictionary


【解决方案1】:

让你的值类型成为一个集合...

Dictionary&lt;string, IEnumerable&lt;string&gt;&gt;.

您必须对这些值做更多的工作,但您可以存储任意数量的唉。如果您想要性能或唯一性,您可以换入 hashset 等集合类型。

要在评论的上下文中使用它:

idDictionary.ForEach(id => WriteLog("Input Id = {0} - Matching record Id = {1}", id.Key, string.Concat(id.Value)));

将您的值设为 IEnumerable 字符串,然后使用 string.Concat 将它们拼接在一起。就个人而言,我更喜欢使用完整的符号 Foreach 循环并使用StringBuilder 构建字符串。它更冗长,但可读性强,您可以在值之间添加分隔符以使其可读。

【讨论】:

  • 感谢编辑,iOS Safari 浏览了我的代码 sn-p!!
  • 我喜欢这个主意,但你能进一步解释一下吗?我将如何操纵以下行来处理该集合? idDictionary.ForEach(id => WriteLog("Input Id = {0} - 匹配记录Id = {1}", id.Key, id.Value));
【解决方案2】:

为什么不直接使用 IEnumerable> 而不是 Dictionary?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2019-06-09
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    相关资源
    最近更新 更多