使用Linq从平面列表创建嵌套列表

时间:2012-11-10 17:23:43

标签: c# asp.net linq

我有一个像

这样的字符串列表
A01,B01 ,A02, B12, C15, A12,  ... 

我想将列表放入列表清单或列表的列表中,以便列出 所有以相同字母开头的字符串都组合在一起(使用linq)

A -> A01 , A02 , Al2
B -> B01 , B12
C -> C15

    A -> 01 , 02 , l2
    B -> 01 , 12
    C -> 15

现在我只使用for循环迭代列表并将值添加到字典中的approp列表中。

(可能不对!)

   Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>();

         foreach( string str in stringList)
         {
            string key = str.Substring(0,1);
            if (!dict.ContainsKey(key)){
                dict[key] = new List<string>();
            }

            dict[key].Add(str);
         }

修改
 哦对不起,我忘了添加这个, 我有一个类别obj列表,这些是类别名称 我需要检索Dictionary<string, List<Category>>之类的内容,我希望将其绑定到nested list。 (asp.net/ mvc)

使用Linq有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

听起来你想通过Lookup扩展方法ToLookup获得{{3}}:

var lookup = stringList.ToLookup(x => x.Substring(0, 1));

查找将让您可以对字典执行任何操作,但在构建之后它是不可变的。哦,如果你要求丢失钥匙,它会给你一个空序列而不是错误,这可能非常有帮助。

答案 1 :(得分:1)

来自聊天室,试试吧。我知道这不是最优雅的解决方案,可能会更好。

List<string> listOfStrings = {"A01", "B01", "A02", "B12", "C15", "A12"}.ToList();


var res = listOfStrings.Select(p => p.Substring(0, 1)).Distinct().ToList().Select(p => 
new {
       Key = p,
       Values = listOfStrings.Where(c => c.Substring(0, 1) == p)
}).ToList();

foreach (object el_loopVariable in res) {
     el = el_loopVariable;
     foreach (object x_loopVariable in el.Values) {
         x = x_loopVariable;
         Console.WriteLine("Key: " + el.Key + " ; Value: " + x);
     }
}

Console.Read();

提供以下输出:

enter image description here

答案 2 :(得分:0)

如果你想使用字典,你可能想要这个

       List<String> strList = new List<String>();
        strList.Add("Axxxx");
        strList.Add("Byyyy");
        strList.Add("Czzzz");
        Dictionary<String, String> dicList = strList.ToDictionary(x => x.Substring(0, 1));
        Console.WriteLine(dicList["A"]);