2014-02-19 55 views
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

是啊,你是什么意思的“更好的方式”...它有什么问题吗? –

+2

不能同意更多。这看起来很好,把%2放在一个变量中,你可以在组中有任意数量的项目,即x组的大小。 – bjorsig

回答

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

这的确更短,更好读。我总是担心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()); 
相关问题