List 覆盖附加值C#

问题描述 投票:0回答:1

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

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();
        line 1 = Console.ReadLine();
        line 2 = Console.ReadLine();
        quit = Console.ReadLine();
     }
     newSystem.Add(line1, line2);
     sysList.Add(new KeyValuePair<string, Dictionary<string, string>>(ws.Name,newSystem));
}

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

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

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

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以外,无法正确处理相同的键,并且找不到合适的解决方案。

我非常感谢您提供的任何帮助。如果您需要其他详细信息,请让我知道。

编辑:期望的结果(示例):

#########:         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"
c# .net .net-core keyvaluepair
1个回答
0
投票

尝试下面的代码:

            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);

                 }
             }
© www.soinside.com 2019 - 2024. All rights reserved.