Это можно сделать с помощью LINQ, но я не смог найти пути с хорошей производительностью.
Простой способ сделать это основан на Словаре и HashSet :
IList<string[]> infoList = ParseStream(infoFile);
var dictionary = new Dictionary<string, Dictionary<string, HashSet<string>>>();
foreach (var articeInfo in infoList)
{
string class1 = articeInfo[3];
string class2 = articeInfo[4];
string class3 = articeInfo[5];
Dictionary<string, HashSet<string>> class1Categories;
if (!dictionary.TryGetValue(class1, out class1Categories))
{
class1Categories = new Dictionary<string, HashSet<string>>();
dictionary[class1] = class1Categories;
}
HashSet<string> class2Categories;
if (!class1Categories.TryGetValue(class2, out class2Categories))
{
class2Categories = new HashSet<string>();
class1Categories[class2] = class2Categories;
}
class2Categories.Add(class3);
}
Результатом являются иерархические данные, где первый уровень - это class1, второй - это class2, а последний - class3. Ключи словаря различаются по умолчанию, как и значения HashSet, поэтому они не имеют дублирующих значений.
Например, чтобы напечатать все значения иерархически с отступом:
var classes = new Dictionary<string, Dictionary<string, HashSet<string>>>();
foreach (var class1 in classes)
{
Console.WriteLine(class1.Key);
foreach (var class2 in class1.Value)
{
Console.WriteLine("\t{0}", class2.Key);
foreach (var class3 in class2.Value)
{
Console.WriteLine("\t\t{0}", class3);
}
}
}