按索引排序列表

时间:2014-03-05 08:06:50

标签: c#

我得到一个字符串:z | a | b | c | a | b | c | a | b | c

我想要三个数组或列表:arrayOne = a a a,arrayTwo = b b b,arrayThree = c c c

到目前为止,我像这样分割字符串

List<string> myList = myString.Split('|').ToList();

z,a,b,c可以是任何字符串值

任何帮助将不胜感激。

arrayOne = myListIndex 1,4,7
arrayTwo= myListIndex 2,5,8
arrayThree = myListIndex 3,6,9

但myList可以是任意长度

4 个答案:

答案 0 :(得分:8)

如果我理解正确,您需要使用GroupBy()来获取列表:

var result = myString.Split('|').ToList()
    .GroupBy(c => c)
    .Select(g => g.ToList())

以下是LinqPad的结果:

Results

答案 1 :(得分:2)

跳过第一项并使用Index mod 3获取所需的列表。

string myString = "z|a|b|c|a|b|c|a|b|c";
List<List<string>> result = myString.Split('|').Skip(1)
        .Select((s, i) => new { s, i })
        .GroupBy(x => x.i % 3)
        .Select(g => g.Select(c => c.s).ToList())
        .ToList();

答案 2 :(得分:0)

您可以使用.GroupBy()

myList.GroupBy(a => a).Select(group => group.ToList());

这将是您想要的列表集合。

如果你保留这些组,你可以看到集合的Key分组。

答案 3 :(得分:0)

跳过第一个项目并将其余部分分成三个列表,每个第3个元素

    var arrayOne = myList.Skip(1).Where((x, i) => i % 3 == 0).ToList();
    var arrayTwo = myList.Skip(1).Where((x, i) => i % 3 == 1).ToList();
    var arrayThree = myList.Skip(1).Where((x, i) => i % 3 == 2).ToList();