最有效的方式来连接列表中的列表,而不需要循环

本文关键字:列表 不需要 循环 连接 有效 方式 | 更新日期: 2023-09-27 18:09:54

public class Unicorn
{
    public List<int> Numbers { get; set; }
}
unicorns.Add(new Unicorn() { Numbers = {1, 2, 3} } );
unicorns.Add(new Unicorn() { Numbers = {4, 5, 6} } );
unicorns.Add(new Unicorn() { Numbers = {7, 8, 9} } );

在c# 4中将所有的列表连接成一个{1,2,3,4,5,6,7,8,9}的列表的最有效的方法是什么?

最好(理想情况下;偏好;如果有选择的话)没有循环和Linq-less。我对。findall进行了一些修改,但它没有挖掘它

最有效的方式来连接列表中的列表,而不需要循环

List<int> theInts = unicorns.SelectMany(unicorn => unicorn.Numbers).ToList();

没有测量,这里唯一让我从性能角度停下来的是。tolist

如果有大量的数字,ToList可能会重复地重新分配它的后备数组。为了避免这种行为,你必须知道预期会有多少个number。

List<int> theInts = new List<int>(expectedSize);
theInts.AddRange(unicorns.SelectMany(unicorn => unicorn.Numbers));

这是一个完全满足您需求的解决方案:No Linq和No循环-我很确定您不想使用这段代码:

List<Unicorn> unicorns = new List<Unicorn>();
unicorns.Add(new Unicorn() { Numbers = new List<int>{1, 2, 3} } );
unicorns.Add(new Unicorn() { Numbers = new List<int> { 4, 5, 6 } });
unicorns.Add(new Unicorn() { Numbers = new List<int> { 7, 8, 9 } });
List<int> numbers = new List<int>();
int count = 0;
AddUnicorn: 
if(count < unicorns.Count)
{
    numbers.AddRange(unicorns[count++].Numbers);
    goto AddUnicorn;
}

你的要求很不寻常,但我想你总是可以这样写:

var numbers = new List<int>();
unicorns.ForEach(unicorn => numbers.AddRange(unicorn.Numbers));

ForEach()可以说是"LINQ-less",因为它是List<T>的真正成员,而不是IEnumerable<T>的扩展方法,而且它实际上早于LINQ本身。

使用。net 4.0的Zip操作符:

     var sums = b.Zip(a, (x, y) => x + y)
        .Concat(b.Skip(a.Count()));

如果你想概括这一点,检查哪个有更多的元素,并使用它作为上面的"b"