列表< KeyValuePair>覆盖附加值 [英] List<KeyValuePair> overrides added values

查看:86
本文介绍了列表< KeyValuePair>覆盖附加值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前遇到一个问题,我想在foreach循环中向同一键添加不同的值。

I am currently facing an issue where I want to add different values to the same Key in a foreach loop.

List<KeyValuePair<string, Dictionary<string, string>>> sysList = new List<KeyValuePair<string, Dictionary<string, string>>>();
Dictionary<string, string> newSystem = new Dictionary<string, string>();
string line1="";
string line2="";
string quit="";
foreach(Worksheet ws in workbook.Worksheets)
{
     while(quit != q)
     {
        newSystem.Clear();
        line1 = Console.ReadLine();
        line2 = Console.ReadLine();
        quit = Console.ReadLine();
     }
     newSystem.Add(line1, line2);
     sysList.Add(new KeyValuePair<string, Dictionary<string, string>>(ws.Name,newSystem));
}

对于第一个工作表的第一次迭代(在一段时间内),一切都很好。如果我选择在此工作表中进行> 1次迭代,则会添加一个新条目,但Dictionary值都相同,例如:

For the first iteration (within while) of the first Worksheet ws everything is fine. If the I choose to do >1 iterations within this Worksheet, there is a new entry added, but the Dictionary values are all the same, f.e.:

syList[0]: "worksheetName","test1","test2"
syList[1]: "worksheetName","test1","test2"
syList[2]: "worksheetName","test1","test2"

如果有多个foreach迭代,则名称保持不变相同,但是newSys添加的字典键和值相同[在第二次foreach迭代之后]:

If there are several foreach iterations, the names stay the same, but the Dictionary Key and Values added by newSys are the same [AFTER the second foreach iteration]:

syList[0]: "worksheetName1","test1","test2"
syList[1]: "worksheetName1","test1","test2"
syList[2]: "worksheetName1","test1","test2"
syList[3]: "worksheetName2","test1","test2"
syList[4]: "worksheetName2","test1","test2"

最初,我尝试使用字典,但是除了使用List之外,无法正确处理相同的键,并且找不到合适的解决方案。

Initially I tried using Dictionaries, but could not handle the same keys properly and did not find a proper solution except for using List.

我非常感谢您的帮助ded。
如果您需要其他详细信息,请告诉我。

I am very grateful for any help provided. If there are additional details that you require, please, let me know.

编辑:
所需结果(示例):

desired result (example):

#########:         ws.Name, line1,   line2
syList[0]: "worksheetName1","ABC","1"
syList[1]: "worksheetName1","DEF","2"
syList[2]: "worksheetName1","ABC","5"
syList[3]: "worksheetName2","ABD","4"
syList[4]: "worksheetName2","ZZZ","1"


推荐答案

尝试下面的代码:

List<List<string>> syList =  new List<List<string>>() {
                                new List<string>() {"worksheetName1","test1","test2"},
                                new List<string>() {"worksheetName1","test1","test2"},
                                new List<string>() {"worksheetName1","test1","test2"},
                                new List<string>() {"worksheetName2","test1","test2"},
                                new List<string>() {"worksheetName2","test1","test2"}
                    };
 Dictionary<string, Dictionary<string, List<string>>> dict = syList
    .GroupBy(x => x.First(), y => y)
        .ToDictionary(x => x.Key, y => y
            .GroupBy(a => a.Skip(1).FirstOrDefault(), b => b.Last())
            .ToDictionary(a => a.Key, b => b.ToList()));


//using normal looping
 Dictionary<string, Dictionary<string, List<string>>> dict2 = new Dictionary<string, Dictionary<string, List<string>>>();

 foreach (List<string> sy in syList)
 {
     if (dict2.ContainsKey(sy[0]))
     {
         Dictionary<string, List<string>> tempDict = dict2[sy[0]];
         if (tempDict.ContainsKey(sy[1]))
         {
             tempDict[sy[1]].Add(sy[2]);
         }
         else
         {
             List<string> newList = new List<string>() { sy[2] };
             tempDict.Add(sy[1], newList);

         }
     }
     else
     {
         Dictionary<string, List<string>> newDict = new Dictionary<string, List<string>>();
         newDict.Add(sy[1], new List<string> { sy[2] });
         dict2.Add(sy[0], newDict);

     }
 }

这篇关于列表&lt; KeyValuePair&gt;覆盖附加值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆