从像这样的制表符限制文本文件中,第一行:列的名称,其余行是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>
其中combinedKey
是Col1+Col2+Col3
的值,所以我根据这些值创建了一个密钥,然后如果文件中有更多行具有相同的combinedKey
我正在列出它们,这就是dictionary
的原因。
它根据要求达到我目前所做的目的。我不会想那个!这就是我对问题的这一部分所需要的。 :)
现在在程序的其他部分我需要另一个combinedKey
,这次:Col1+Col2+Col3+Col4+Col5
有没有办法可以利用我之前解析过的字典?
答案 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解析它。