按条目将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
我想把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
复制到数组。有相似的东西吗?
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
的源代码,微软就是这么做的。