具有多个值的C#字典如何[重复]
Posted
技术标签:
【中文标题】具有多个值的C#字典如何[重复]【英文标题】:C# dictionary with multiple values how to [duplicate] 【发布时间】:2015-11-27 02:17:46 【问题描述】:我正在努力弄清楚如何修改此字典,以便它可以为一个键(如果需要)接受两个值,而不仅仅是一个值。在大多数情况下,一个键只有一个值,但偶尔会有两个值,应用程序不喜欢这样。相反,它会抛出“已添加相同键的项目”异常。在我仍在学习的过程中,我一直在网上搜索有关字典的信息,但一直在努力,并认为我可能会在这里要求有人为我指明正确的方向。从我读过的内容来看,我应该使用动态或元组,但我在使用下面的代码实现它时遇到了麻烦。我知道这个网站上有类似的问题和答案,但我很难将这些答案与这段代码联系起来。非常感谢一个更具体的例子。
public List<ImportItem<T>> ProcessReportResult(CSVTable resultData, ICollection<ImportItem<T>> data, Func<T, string> keyFilter)
WriteLog("10 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.ToLookup
而不是.ToDictionary
感谢 Eser 的建议,您能举例说明一下吗?我现在正在查看 ToLookup,我认为它应该可以工作。只需要弄清楚如何实现它。我还是个n00b
【参考方案1】:
让你的值类型成为一个集合...
Dictionary<string, IEnumerable<string>>
.
您必须对这些值做更多的工作,但您可以存储任意数量的唉。如果您想要性能或唯一性,您可以换入 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
【讨论】:
以上是关于具有多个值的C#字典如何[重复]的主要内容,如果未能解决你的问题,请参考以下文章