2013-03-06 16 views
21

Ecco come vorrei aggiungere un elemento a un oggetto IEnumerable:Qual è il modo migliore per aggiungere un articolo a un oggetto IEnumerable <T>?

//Some IEnumerable<T> object 
IEnumerable<string> arr = new string[] { "ABC", "DEF", "GHI" }; 

//Add one item 
arr = arr.Concat(new string[] { "JKL" }); 

Questo è imbarazzante. Non vedo tuttavia un metodo chiamato qualcosa come ConcatSingle().

Esiste un modo più semplice per aggiungere un singolo elemento a un oggetto IEnumerable?

+0

@Chris: l'ho tirato indietro. C'è un motivo per cui la funzionalità è stata rimossa da SO. –

+0

Non ho capito che questa funzione è stata aggiunta. Grazie per la correzione. –

risposta

14

No, è abbastanza conciso come si otterrà utilizzando le funzionalità di linguaggio/framework incorporate.

Si può sempre creare un metodo di estensione, se si preferisce:

arr = arr.Append("JKL"); 
// or 
arr = arr.Append("123", "456"); 
// or 
arr = arr.Append("MNO", "PQR", "STU", "VWY", "etc", "..."); 

// ... 

public static class EnumerableExtensions 
{ 
    public static IEnumerable<T> Append<T>(
     this IEnumerable<T> source, params T[] tail) 
    { 
     return source.Concat(tail); 
    } 
} 
8

IEnumerable è immutabile collezione, significa che non è possibile aggiungere o rimuovere l'elemento. Al contrario, è necessario creare una nuova collezione per questo, semplicemente per convertire alla lista per aggiungere:

var newCollection = arr.ToList(); 
newCollection.Add("JKL"); //is your new collection with the item added 
+0

Forse mi manca qualcosa .... ma Aggiungi non restituisce il nuovo elenco .... https: //msdn.microsoft.com/en-us/library/vstudio/3wcytfd1 (v = vs.100) .aspx –

+5

Non ti manca nulla. Questo codice è sbagliato. – KingOfHypocrites

+0

'Add' non restituisce la nuova lista ma poiché' List' è una collezione * mutable * puoi semplicemente fare riferimento all'oggetto 'List' per accedere alla 'nuova lista'. Questa risposta è leggermente pedante in questo senso (perché è ovvio che l'OP stava chiedendo come creare un nuovo 'IEnumerable' da un altro' IEnumerable' e un oggetto aggiuntivo). –

6

Scrivi un metodo di estensione ConcatSingle :)

public static IEnumerable<T> ConcatSingle<T>(this IEnumerable<T> source, T item) 
{ 
    return source.Concat(new [] { item }); 
} 

Ma è necessario essere più attenti con la tua terminologia.
Non è possibile aggiungere un articolo a IEnumerable<T>. Concat crea una nuova istanza.

Esempio:

var items = Enumerable.Range<int>(1, 10) 
Console.WriteLine(items.Count()); // 10 
var original= items; 
items = items.ConcatSingle(11); 
Console.WriteLine(original.Count()); // 10 
Console.WriteLine(items.Count()); // 11 

Come si può vedere, l'enumerazione originale - che abbiamo salvato in original non è cambiata.

4

Poiché IEnumerable è di sola lettura, è necessario convertire in elenco.

var new_one = arr.ToList().Add("JKL"); 

Oppure si può ottenere un extension method simili;

public static IEnumerable<T> Append<T>(this IEnumerable<T> source, params T[] item) 
{ 
    return source.Concat(item); 
} 
+0

'IEnumerable ' è di sola lettura. Ciò non significa che sia immutabile. Una collezione immutabile è una collezione che non cambierà mai. Un 'IEnumerable ' non promette nemmeno che il riferimento non possa essere typecast in un tipo mutable, tanto meno che la collezione sottostante non cambierà. – supercat

2

sei l'assegnazione di una matrice a un oggetto IEnumerable. Perché non usi il tipo di matrice invece di IEnumerable?

In alternativa è possibile utilizzare IList (o Elenco) se si desidera modificare la raccolta.

Uso IEnumerable solo per i parametri params quando ho bisogno di leggere e IList (o List) quando ho bisogno di cambiare gli elementi in esso.