分组列表 - 寻找更好的方法

时间:2014-02-19 10:43:27

标签: c# .net linq

我有一个类似的列表

var x = new List<string>{"A","B","C","D","E","F"};

我希望将其分组为双打

1-A

1-B

2-C

2-d

3-E

3-F

我的解决方案

        var result = new Dictionary<int, List<string>>();

        var sequence = 1;

        var groupList = new List<string>();

        for (var i = 0; i < x.Length ; i++)
        {
            groupList.Add(x[i]);

            if ((i + 1)%2 == 0)
            {
                result.Add(sequence, groupList);
                groupList = new List<string>();
                sequence++;
            }

        }

        return result;

我正在寻找其他(更好)方法来获得相同的结果。

3 个答案:

答案 0 :(得分:1)

这也是一样的。

var y = x.GroupBy(i =>Convert.ToInt32((x.IndexOf(i) + 1.1) * 0.5));

答案 1 :(得分:1)

这是另一种方式:

    int numPairs = 3;
    char[] abc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();         
    var dict = new Dictionary<int, char[]>();
    for (int i = 1, k=1; i <= numPairs && k<abc.Length; i++, k+=2)
    {
        dict.Add(i, new char[] { abc[k - 1], abc[k] });
    }
    return dict;

答案 2 :(得分:1)

我认为这是一个可读的Linq解决方案:

var result = x
      .Select((value, index) => new { value, index })
      .GroupBy(arg => arg.index / 2 + 1, arg => arg.value);  

Select将带有索引的值投影为匿名类型,将GroupBy组投影为索引。

如果您需要Dictionary中的分组,请使用ToDictionary

var dictionary = result.ToDictionary(
      grouping => grouping.Key, 
      grouping => grouping.ToList());