我有一个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选择它?
答案 0 :(得分:1)
这可以通过LINQ完成,但我找不到具有良好性能的方法。
一种简单的方法是基于Dictionary和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,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);
}
}
}