从另一个字典创建字典
本文关键字:字典 创建 另一个 | 更新日期: 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>
其中combinedKey
是Col1+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来解析