划分具有未知数量元素的列表

时间:2012-01-11 04:19:10

标签: c#

假设我在字符串值中有一个未知数量的元素列表,我想将它分成n个子阵列或列表(n可以是任何int,例如n = 3),最好的方法是什么?

注意:每组中的元素数量不必相等

2 个答案:

答案 0 :(得分:2)

LINQ GroupBySelect方法可以提供帮助:

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方法存在重载,允许您这样做,请参阅上面的链接)。您可以使用其他一些逻辑来选择密钥。

在我的示例中subListsList<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"}这可能是更合理的分配值的方式。

总而言之,您可以使用GroupBySelect方法实现所需,只需提供适合您所在域的正确分组逻辑。

答案 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的值以查看效果