将IEnumerables或ICollections复制到EXISITING数组中

时间:2016-08-04 06:33:56

标签: c# arrays collections copy

我已经填充了两个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

我想将foobar的元素复制到array。我希望能够在不创建新对象的情况下执行此操作(例如LINQ在调用ConcatToArray时会执行此操作)。在我的具体场景中,我不关心顺序,因为它将在稍后进行排序。实现它的一种方法是:

int k = 0;
foreach (int i in foo)
    array[k++] = i;
foreach (int i in bar)
    array[k++] = i;

我想知道是否有一些内置方法为我复制(为方便起见),类似于LINQ ToArrayConcat,但无需创建新对象。给出范围作为输入也会很好。下面的方法可能是吗?

// 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复制到数组。有什么相似之处吗?

1 个答案:

答案 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

InsertRangeAddRange都重新分配内部数组 - 我假设Concut / Union在幕后使用这些