如何转置列表<t>取决于第一个字母

时间:2016-04-28 20:15:26

标签: c# linq

我有字符串列表,我想根据第一个字母来调整它。

List<string> lst = new List<string>();
lst.Add("A1");
lst.Add("A2");
lst.Add("A3");
lst.Add("B1");
lst.Add("B2");
lst.Add("B3");
lst.Add("C1");
lst.Add("C2");
lst.Add("C3");

我要做的就是创建一个如下所示的新矩阵:

A  B  C
1  1  1
2  2  2
3  3  3

输出可以是任何类型的合适对象,我可以循环它。

有什么建议吗?还是重定向?

由于

注意A,B,C不固定,也可以是A,B,C,D,E..Z。 1,2,3可以按任何顺序排列。

由于

2 个答案:

答案 0 :(得分:2)

此转化称为pivot而不是transpose。移调只需用y轴切换x轴。

这会为您提供包含所需数据的string[][]

var pivot = lst.Select(x => new
    {
        Column = x[0].ToString(),
        Value = x.Substring(1)
    })
    .GroupBy(x => x.Column, (k, g) => new[] { k }.Concat(g.Select(x => x.Value)).ToArray())
    .ToArray();

答案 1 :(得分:1)

另一种方法是使用此LINQ表达式创建Lookup:

var result = lst.Select(x => new {Key = x[0], Value = x.Substring(1)})
    .ToLookup(x => x.Key, x => x.Value);

然后你可以循环它:

foreach (var k in result)
{
    Console.WriteLine(k.Key);
    foreach (var val in k)
    {
        Console.WriteLine("  " + val);
    }
}