从另一个字典创建字典

本文关键字:字典 创建 另一个 | 更新日期: 2023-09-27 18:15:11

对于这样一个有制表符限制的文本文件,第一行:列名,其余行:每个列的值,…

Col1    Col2    Col3    Col4    Col5    Col6    Col7    Col8....
Val1    Val2    Val3    Val4    Val5    Val6    Val7    Val8...
abc1    abc2    abc3    abc4    abc5    abc6    abc7    abc8...
.....
......
......

我做了一个Dictionary<combinedKey, List<MyRows> myList>其中combinedKeyCol1+Col2+Col3的值,因此我根据这些值制作了一个键,然后如果文件中有更多的行,具有相同的combinedKey,我正在制作它们的列表,所以这就是为什么它是dictionary。它服务于我目前所做的基于需求的事情的目的。我不会改变的!这就是这部分问题所需要的。:)

现在在程序的其他部分我需要另一个combinedKey,这次是:Col1+Col2+Col3+Col4+Col5是否有一种方法可以利用前面解析和填充的字典?

从另一个字典创建字典

有趣的问题。不幸的是,没有一个真正的好方法来做到这一点,至少我知道。无论如何,您都必须多次接触每个记录,因此您不妨为两个组使用LINQ并使它们独立。这样至少会更容易读懂。

假设您的数据是用制表符分隔的。鉴于此,您可以这样做。

var rows = File.ReadAllLines(filePath).Select(c => 
                                              {
                                                  string[] args = c.Split('t);
                                                  return new
                                                  {
                                                      Col1 = args[0],
                                                      Col2 = args[1],
                                                      Col3 = args[2],
                                                      Col4 = args[3],
                                                      Col5 = args[4],
                                                      Col6 = args[5],
                                                      Col7 = args[6],
                                                      Col8 = args[7]
                                                  };
                                              }).ToArray(); // I wouldn't use ToArray here if you were only looking for one grouping, since that would be less efficient on memory and CPU usage
var groupedByThree = rows.GroupBy(c => c.Col1 + c.Col2 + c.Col3);
var groupedByFive = rows.GroupBy(c => c.Col1 + c.Col2 + c.Col3 + c.Col4 + c.Col5);

我知道这比你问的要多,因为我包含了一些解析逻辑,这几乎肯定不适用于你的特定情况。但我就是这么做的。首先建立一个平面列表,然后将每个集合独立分组。

我的意思是,当然,你总是可以做类似的事情,并使用你已经得到的解析和分组,但它不会在复杂性的意义上更性能,我认为它的可读性更差。

var dict = new Dictionary<combinedKey, List<MyRows>>(); // your data here
var dimensioned = dict.ToDictionary(c => c.Key, c => c.Value.ToDictionary(x => x.Col4 + x.Col5));

如你所见,这创建了一个字典的字典,看起来像这样:

{
    col1col2col3
    {
        col4col5
        {
            individual records
        }
    }
}

你可以随意把它摊平。如果可以的话,我还是让它像这样分层。你可以这样使用:

foreach(var record in dict[col1col2col3][col4col5])
{
    // handle
}

或者你甚至可以反向获取原始字典:

dict[col1col2col3].SelectMany(c => c.Value);

实际上,我很想从一开始就把原始字典解析成这样的东西,然后你只在内存中存储一次。我还是用LINQ来解析