按条目将IEnumerables或ICollections复制到EXISITING数组中

本文关键字:复制 EXISITING 数组 ICollections IEnumerables | 更新日期: 2023-09-27 18:00:04

我已经填充了两个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复制到数组。有相似的东西吗?

按条目将IEnumerables或ICollections复制到EXISITING数组中

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在幕后使用这些

如果您的IEnumerable对象也实现了ICollection,则可以将其强制转换为ICollection,并使用该接口提供的CopyTo方法,否则只能编写循环。实际上,我查看了Enumerable.ToArray的源代码,微软就是这么做的。