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

3
我有一个类似这样的列表。
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
那种方法有什么问题吗?只需将它放进一个函数中,然后完成它。 - musefan
1
是的,"更好的方法"是什么意思...有什么问题吗? - Naveed Ahmad
2
完全同意。这看起来很好,将%2中的2放入变量中,您可以拥有任意数量的项目组,即x大小的组。 - bjorsig
1
这是一个 Code to Linq 请求吗? - Andrei V
谁给这个问题点赞了??解释一下你们自己! - musefan
显示剩余2条评论
3个回答

1
这将做相同的事情。
var y = x.GroupBy(i =>Convert.ToInt32((x.IndexOf(i) + 1.1) * 0.5));

1
较短的形式: var y = x.GroupBy(i => Convert.ToInt32(x.IndexOf(i) / 2) + 1); - MelnikovI
这确实更短,更易读。当它是0.5时,我总是担心四舍五入问题,因为它就在边缘上。而且乘法只是我从嵌入式C时代养成的习惯,因为它稍微快一点。现在我猜编译器会替你完成这个操作。 :) - David

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;

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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接