我已经填充了两个IEnumerable
和一个足够大的数组来存储它们的所有元素:
IEnumerable<int> foo = ... // contains some elements.
IEnumerable<int> bar = ... // contains some elements.
int[] array = ... // already existing. array.Length is at least foo.Count + bar.Count
我想将foo
和bar
的元素复制到array
。我希望能够在不创建新对象的情况下执行此操作(例如LINQ在调用Concat
或ToArray
时会执行此操作)。在我的具体场景中,我不关心顺序,因为它将在稍后进行排序。实现它的一种方法是:
int k = 0;
foreach (int i in foo)
array[k++] = i;
foreach (int i in bar)
array[k++] = i;
我想知道是否有一些内置方法为我复制(为方便起见),类似于LINQ ToArray
或Concat
,但无需创建新对象。给出范围作为输入也会很好。下面的方法可能是吗?
// desired way:
foo.InsertIntoArray(0) // insert the elements of foo into array starting at index 0
bar.InsertIntoArray(foo.Count) // insert the elements of bar into array starting at index foo.Count
我知道Array.Copy
方法,但据我所知,它只能从数组复制到数组,而不是从IEnumerable
复制到数组。有什么相似之处吗?
答案 0 :(得分:1)
List<int> foo = new List<int> { 1, 2, 3 };
List<int> bar = new List<int> { 3, 4, 5 };
//This will give you all items from both collections
var array = Enumerable.Concat(foo, bar).ToArray(); // 1,2,3,3,4,5
var array = foo.Concat(bar).ToArray();
//This will give you all distinct items
var array = Enumerable.Union(foo, bar).ToArray(); //1,2,3,4,5
var array = foo.Union(bar).ToArray();
你也可以:
List<int> result = new List<int>();
result.AddRange(foo);
result.AddRange(bar);
result.InsertRange(result.Count, foo);
result.InsertRange(result.Count, bar);
foo.AddRange(bar); //But was assuming you don't want to change the existing list
但InsertRange和AddRange都重新分配内部数组 - 我假设Concut / Union在幕后使用这些