最有效的方式来连接列表中的列表,而不需要循环
本文关键字:列表 不需要 循环 连接 有效 方式 | 更新日期: 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"