我有一个类似的列表
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;
我正在寻找其他(更好)方法来获得相同的结果。
答案 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());