使用LinQ从csv中选择树

时间:2009-10-24 16:33:32

标签: linq c#-3.0 csv tree

我有一个35K行的csv,其中包括以下列:articleID,description,class1,class2,class 3.
类collumns表示产品所属的类别。 class1是主要类别,class2是class1的子类别,class3是class2的子类别。
现在我想在树结构中提取类别,但我有点迷失。

我唯一能想到的是以下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选择它?

1 个答案:

答案 0 :(得分:1)

这可以通过LINQ完成,但我找不到具有良好性能的方法。

一种简单的方法是基于DictionaryHashSet

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,2nd是class2,last是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);
        }
    }
}