假设我在字符串值中有一个未知数量的元素列表,我想将它分成n个子阵列或列表(n可以是任何int,例如n = 3),最好的方法是什么?
注意:每组中的元素数量不必相等
答案 0 :(得分:2)
var list = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
int groupCount = 3;
var subLists = list.Select((s, i) => new {Str = s, Index = i}).
GroupBy(o => o.Index % groupCount, o => o.Str).
Select(coll => coll.ToList()).
ToList();
此代码将导致subLists
包含三个List<string>
集合的列表:{"A", "D", "G"}
,{"B", "E"}
和{"C", "F"}
。为了实现这一目标,我基于原始列表中的元素索引进行分组(Select
方法存在重载,允许您这样做,请参阅上面的链接)。您可以使用其他一些逻辑来选择密钥。
在我的示例中subLists
是List<List<string>>
。如果您需要数组,请在适当的位置使用ToArray
。
编辑:如果您关心列表之间的值分配方式,使用模运算进行分组可能不是一个好主意。可能更好的选择是这样做:
var list = new List<string>() { "A", "B", "C", "D", "E", "F", "G" };
int groupCount = 3;
int maxPerGroup = (int)Math.Ceiling((double)list.Count / groupCount);
var subLists = list.Select((s, i) => new {Str = s, Index = i}).
GroupBy(o => o.Index / maxPerGroup, o => o.Str).
Select(coll => coll.ToList()).
ToList();
这将产生以下结果:{"A", "B", "C"}
,{"D", "E", "F"}
,{"G"}
这可能是更合理的分配值的方式。
总而言之,您可以使用GroupBy
和Select
方法实现所需,只需提供适合您所在域的正确分组逻辑。
答案 1 :(得分:0)
交替地,您可以在linq中执行此操作
var n = 4;
var i = 0;
var list = new List<string> { "a", "b", "c", "d", "e", "f", "g" };
var res = list.GroupBy(x => Math.Ceiling((double)++i / n)).Select(x=>x.Select(y=>y).ToList()).ToList();
Console.Write(res);
在控制台程序或Linqpad中写入此内容并更改n的值以查看效果