Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将IEnumerables或ICollections复制到现有数组条目中_C#_Arrays_Collections_Copy - Fatal编程技术网

C# 将IEnumerables或ICollections复制到现有数组条目中

C# 将IEnumerables或ICollections复制到现有数组条目中,c#,arrays,collections,copy,C#,Arrays,Collections,Copy,我已经填充了两个IEnumerables,并且有一个足够大的数组来存储这两个元素的所有元素: IEnumerable<int> foo = ... // contains some elements. IEnumerable<int> bar = ... // contains some elements. int[] array = ... // already existing. array.Length is at least foo.Count + bar.Co

我已经填充了两个
IEnumerable
s,并且有一个足够大的数组来存储这两个元素的所有元素:

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
我想知道是否有某种内置方法可以为我进行复制(为了方便起见),类似于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
复制到数组。有相似的东西吗?

listfoo=新列表{1,2,3};
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();
列表栏=新列表{3,4,5}; //这将为您提供两个集合中的所有项目 var array=Enumerable.Concat(foo,bar).ToArray();//1,2,3,3,4,5 var数组=foo.Concat(bar.ToArray(); //这将为您提供所有不同的项目 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
列表结果=新列表();
结果:添加范围(foo);
结果:添加范围(bar);
result.InsertRange(result.Count,foo);
result.InsertRange(result.Count,bar);
食物添加范围(巴)//但是假设您不想更改现有列表

但是,这两种方法都可以重新分配内部数组——我假设NACTT/Union在幕后使用这些方法——“不迭代循环”——这是什么意思?甚至
Buffer.BlockCopy()
也涉及一个循环。如果希望避免在代码中编写循环,可以轻松编写自己的helper方法来实现这一点。在
数组
可枚举
中没有一种方法可以精确地执行您的要求,但是自己实现一种方法是很简单的。您甚至可以将其作为
可枚举类的扩展方法。但是不管你怎么做,总会有一个循环,我的意思是“不需要在我的代码中写循环”。内部发生的事情对我来说并不重要,只要它不创建一个新的
IEnumerable
array
。编写助手方法仍然需要自己编写循环。我只是想知道是否有方法可以帮我做到这一点。如果答案是“否”,我会说,这不是投票反对的理由。“编写助手方法仍然需要自己编写循环”——它需要自己编写一个循环。一旦为什么那么糟糕?毕竟,神秘的
InsertIntoArray()
方法会有一个循环。为什么要避免创建新的
IEnumerable
?上面显示的代码创建了两个。为什么不创建一个新数组?上面的代码可以。你到底想要什么真的不清楚。@PeterDuniho“为什么那么糟糕?”-这很不方便。为什么集合的所有LINQ扩展方法都存在?不是因为它们添加了新功能,而是因为它们很方便。如果要求一个现有的方法,一个人可以很容易地写自己是这样一件坏事,为什么人们不断要求(在这里也是如此)?Copy是在单个循环中轻松编写的方法之一。所以我们不应该拥有它,对吗?我们不应该要求它,对吗?但我们(两个)都有。你没有抓住重点。你的规格不清楚。在.NET中似乎没有一种方法能够满足您的规范,但是如果您不解释为什么您对问题施加了限制,没有人能够合理地理解什么答案可以解决您的问题。没有人,尤其是我,说因为你可以很容易地编写它,所以它不应该在框架中。我想说的是,你需要清楚你的实际需要是什么,特别是解释为什么这里会包括你自己的代码示例都不满足的约束。这难道不会产生很多新的
IEnumerable
s吗?据我所知,
Concat
ToArray
总是创建新对象,所以这不是我想要的。@Kjara-我添加到
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