命题是:有一个集合,形如List<string>() { "AAA", "BBB", "CCC", "DDD", "EEEE", "FFF" }。要求将集合分成三个子集合,每个子集合里面包含两个旧元素和两个空格,空格放在每个旧元素的后面。代码表示为{ "AAA","", "BBB",""}、{ "CCC","", "DDD",""}、{ "EEEE","", "FFF",""}
最后的实现代码为:
List<string> list = new List<string>() { "AAA", "BBB", "CCC", "DDD", "EEEE", "FFF" }; int cnt = 3; List<string[]> res = new List<string[]>(); for (int k = 0; k < 2; k++) res.Add(list.Skip(k * cnt).Take(cnt).Select(x => new string[] { x, "" }).Aggregate( (x, y) => x.Concat(y).ToArray()));
其中res为最终需要返回的结果。
在这段代码中,我用了四个LinQ的扩展方法。Skip,Take,Select和Aggregate。第一个函数Skip的意思是跳过N个元素,返回剩下的。它得到{ "AAA", "BBB" ,"CCC", "DDD","EEEE", "FFF"}以及{"CCC", "DDD","EEEE", "FFF"}和{"EEEE", "FFF"}
第二个函数Take的意思为从头开始,返回N个连续的元素。它会得到{ "AAA", "BBB" },{"CCC", "DDD"},{"EEEE", "FFF"}
第三个函数Select的意思是“通过合并元素的索引将序列中的每个元素投影到新表中”。本实例中的作用是返回每个元素+空格的阵列。本步骤后会得到{string[]{"AAA",""}, string[]{"BBB",""}},{string[]{"CCC",""},string[]{"DDD",""},},{string[]{"EEEE",""},string[]{"FFF",""}}
最后一个函数Aggregate的作用是针对返回的阵列的集合进行内部运算合并成字符串的阵列。
此时将会返回{string[]{ "AAA","", "BBB",""}、string[]{"CCC","", "DDD",""}、string[]{ "EEEE","", "FFF",""}}
到此,我想要的结果即实现了。
欢迎交流和纠正。