2012-01-11 28 views
0

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

注:各组中的元素的数量是没有必要为等于

回答

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方法来实现您所需要的,只需提供适合您的域的正确分组逻辑即可。

+0

是什么=>这里的意思?我们在这种情况下访问每个子列表的人是谁? – ikel 2012-01-11 04:39:14

+0

@ikel:'=>'是Lambda表达式的语法(http://msdn.microsoft.com/en-us/library/bb397687.aspx),它们是面包和LINQ代码的黄油。我假设你还没有进入LINQ。也许是时候尝试了? 101 LINQ示例(http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b)是一个很好的开始。 – Dyppl 2012-01-11 04:45:05

+0

谢谢,我将不得不尝试它,然后回到这里 – ikel 2012-01-11 04:46:52

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); 

写这在控制台程序或N的Linqpad和变化值来看看效果

相关问题