2016-08-04 28 views
-2

Ich habe zwei IEnumerable s bereits gefüllt und ein Array groß genug, um alle Elemente der beiden von ihnen zu speichern:Copy IEnumerables oder ICollections in ein bestehendes Array-Eintrag weise

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 

ich die Elemente foo kopieren möchten und bar in array. Und ich würde gerne in der Lage sein, dies zu tun, ohne neue Objekte zu erstellen (wie LINQ würde tun, wenn Concat oder ToArray aufrufen). In meinem konkreten Szenario ist mir die Reihenfolge egal, da sie später sortiert wird. Ein Weg, dies zu erreichen, ist dies:

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

Ich mag möchte wissen, ob es eine integrierte Methode ist, die das Kopieren für mich tut (der Einfachheit halber Zwecke), ähnlich wie LINQ ToArray oder Concat, aber ohne dass um neue Objekte zu erstellen. Bereiche als Eingabe zu geben, wäre auch schön. Eine Methode wie unten vielleicht?

// 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 

Ich kenne die Array.Copy Methode, aber soweit ich weiß, es funktioniert nur von Array zu Array kopieren, nicht von IEnumerable zu Array. Gibt es etwas Ähnliches?

+0

_ "ohne durch eine Schleife iterieren" _ -- Was meinen Sie? Sogar 'Buffer.BlockCopy()' beinhaltet eine Schleife. Wenn Sie vermeiden möchten, eine Schleife in Ihren Code zu schreiben, können Sie einfach Ihre eigene Hilfsmethode schreiben, um dies zu erreichen. Es gibt keine Methode in 'Array' oder' Enumerable', um genau das zu tun, was Sie fragen, aber es ist trivial, selbst eines zu implementieren. Sie können es sogar zu einer Erweiterungsmethode der Klasse "Enumerable" machen. Aber wie auch immer Sie es tun, es wird eine Schleife _irgendwo_ geben müssen. –

+0

Ich meinte "ohne Schleifen in meinem Code schreiben zu müssen". Was intern passiert, ist mir egal, solange es kein neues 'IEnumerable' oder 'Array' erzeugt. Das Schreiben einer Hilfsmethode beinhaltet immer noch das Schreiben von Schleifen. Ich möchte nur wissen, ob es Methoden gibt, die das für mich tun. Wenn die Antwort "Nein" lautet, ist dies kein Grund, um abzustimmen, würde ich sagen. – Kjara

+0

_ "Das Schreiben einer Hilfsmethode beinhaltet immer noch das Schreiben von Schleifen" _ - es beinhaltet das Schreiben _einer einzigen Schleife _ selbst. Einmal. Warum ist das so schlimm? Schließlich würde die mythische 'InsertIntoArray()' Methode eine Schleife haben. Und warum willst du es vermeiden, ein neues "IEnumerable" zu erstellen? Der Code, den Sie oben anzeigen, erstellt _zwei_. Warum willst du kein neues Array erstellen? Der obige Code tut es. Es ist wirklich nicht klar, was Sie überhaupt wollen. –

Antwort

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(); 

Sie können auch:

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 

aber beide InsertRange und AddRange das interne Array umverteilen - Und ich nehme ConCut/Union verwenden diese hinter den Kulissen

+0

Erzeugt das nicht viele neue 'IEnumerable's? So weit ich weiß, erstellen 'Concat' und' ToArray' immer neue Objekte, also ist das nicht was ich will. – Kjara

+0

@Kjara - Ich habe ToArray hinzugefügt, nur weil Sie es als Array haben wollten –