从另一个字典创建字典

时间:2014-07-28 19:09:49

标签: c# dictionary

从像这样的制表符限制文本文件中,第一行:列的名称,其余行是eahc列的值,...

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 有没有办法可以利用我之前解析过的字典?

1 个答案:

答案 0 :(得分:1)

有趣的问题。不幸的是,至少我所知道的,这并不是一个很好的方法。无论你需要多次触摸每条记录,所以你不妨只为两个组使用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);

我知道这比你要问的要多,因为我包含了一些几乎绝对不适用于你特定情况的解析逻辑。但那是我如何做到的。首先构建一个平面列表,然后单独对每个集合进行分组。

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

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解析它。