2014-02-19 78 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()); 
相關問題