使用LinQ从csv中选择树

使用LinQ从csv中选择树,linq,c#-3.0,csv,tree,Linq,C# 3.0,Csv,Tree,我有一个包含35K行的csv,其中包括以下内容:articleID、description、class1、class2、class3。 类collumns表示产品所属的类别。类别1是主类别,类别2是类别1的子类别,类别3是类别2的子类别。 现在我想提取树状结构中的类别,但我有点迷路了 我唯一能想到的就是使用下面的linq查询来获得一个不同的列表。一般来说,我不是linq或c/.Net方面的专家。。。 ParseStream函数返回一个行列表,其中包含一个collumn值数组。i[3]、[4]和[

我有一个包含35K行的csv,其中包括以下内容:articleID、description、class1、class2、class3。 类collumns表示产品所属的类别。类别1是主类别,类别2是类别1的子类别,类别3是类别2的子类别。 现在我想提取树状结构中的类别,但我有点迷路了

我唯一能想到的就是使用下面的linq查询来获得一个不同的列表。一般来说,我不是linq或c/.Net方面的专家。。。 ParseStream函数返回一个行列表,其中包含一个collumn值数组。i[3]、[4]和[5]代表类别1、2和3

List<string[]> infoList = ParseStream(infoFile);
            List<string> categories = (from i in infoList 
                                       select new StringBuilder().Append(i[3]).Append(";").Append(i[4]).Append(";").Append(i[5]).ToString())
                                       .Distinct().ToList();
这只是给我一个所有类别路径的单独列表。。。
我认为存储hiarchical列表的最佳数据类型是什么?如何使用linq选择此选项?

这可以使用linq完成,但我找不到性能良好的方法

一种简单的方法是基于和:

结果是分层数据,其中第一级是class1,第二级是class2,最后一级是class3。默认情况下,字典键是不同的,哈希集值也是不同的,因此不会有重复的值

例如,要以分层缩进方式打印所有值,请执行以下操作:

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);
        }
    }
}

这可以用LINQ完成,但我找不到性能好的方法

一种简单的方法是基于和:

结果是分层数据,其中第一级是class1,第二级是class2,最后一级是class3。默认情况下,字典键是不同的,哈希集值也是不同的,因此不会有重复的值

例如,要以分层缩进方式打印所有值,请执行以下操作:

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);
        }
    }
}

很好,很有效的答案。Dictionary和HashSet是存储这些信息的好方法。但我想用linq在1个语句中选择它…很好的,有效的答案。Dictionary和HashSet是存储这些信息的好方法。但我想用linq…Retag在1个语句中选择它。没有C3.5,请参见Retag。没有C3.5,请参见