2013-01-04 35 views
114

Ho due istanze di IEnumerable<T> (con lo stesso T). Voglio una nuova istanza di IEnumerable<T> che è la concatenazione di entrambi.Come concatenare due IEnumerable <T> in un nuovo IEnumerable <T>?

C'è un metodo built-in in .Net per farlo o devo scriverlo da solo?

+9

Si consiglia di aggiungere un segnalibro http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b. –

+0

correlati, se aiuta: [Modo elegante per combinare più raccolte di elementi?] (Http://stackoverflow.com/questions/4493858/elegant-way-to-combine-multiple-collections-of-elements) – nawfal

risposta

189

Sì, LINQ to Objects permette di farlo con Enumerable.Concat:

var together = first.Concat(second); 
+0

Io sempre dimentica di cercare i metodi di estensione, tx. –

+9

@ SamuelRossille Inoltre, non dimenticare che i nomi delle azioni che si desidera eseguire sono probabilmente vicini se non vengono definiti esattamente ciò che si sta cercando. Scorri sempre IntelliSense, impari molto. –

+2

È male fare secondo = first.Concat (secondo)? avremo problemi di concorrenza? – user2934433

4

È possibile utilizzare sotto codice per la soluzione: -

public void Linq94() 
{ 
    int[] numbersA = { 0, 2, 4, 5, 6, 8, 9 }; 
    int[] numbersB = { 1, 3, 5, 7, 8 }; 

    var allNumbers = numbersA.Concat(numbersB); 

    Console.WriteLine("All numbers from both arrays:"); 
    foreach (var n in allNumbers) 
    { 
     Console.WriteLine(n); 
    } 
} 
2
//The answare i was looking for when searching 
public void Answer() 
{ 
    IEnumerable<YourClass> first = this.GetFirstIEnumerableList(); 
    //Assign to empty list so we can use later 
    IEnumerable<YourClass> second = new List<YourClass>(); 

    if (IwantToUseSecondList) 
    { 
     second = this.GetSecondIEnumerableList(); 
    } 
    IEnumerable<SchemapassgruppData> concatedList = first.Concat(second); 
} 
12

Il metodo Concat restituirà un oggetto che implementa IEnumerable<T> restituendo un oggetto (chiamalo Cat) il cui enumeratore tenterà di utilizzare i due elementi enumerabili passati (chiamarli A e B) in sequenza. Se le enumerabili passate rappresentano sequenze che non cambieranno durante la vita di Cat, e che possono essere lette senza effetti collaterali, allora Cat può essere usato direttamente. In caso contrario, potrebbe essere una buona idea chiamare ToList() su Cat e utilizzare il risultato List<T> (che rappresenterà un'istantanea dei contenuti di A e B).

Alcune enumerazioni acquisiscono un'istantanea all'avvio dell'enumerazione e restituiscono i dati da tale istantanea se la raccolta viene modificata durante l'enumerazione. Se B è così enumerabile, qualsiasi modifica a B che si verifica prima che Cat abbia raggiunto la fine di A apparirà nell'enumerazione di Cat, ma le modifiche che si verificano dopo non lo faranno. Tale semantica potrebbe probabilmente confondere; scattare un'istantanea di Cat può evitare tali problemi.

Problemi correlati