22

Ho provato questo codice per l'aggiunta di b a books:Come inizializzare IEnumerable <Object> che è vuoto e consentire a Concat di farlo?

IEnumerable<Book> books =null; 
foreach (Book b in context.Books.AsEnumerable()) 
    if (someConditions) 
     books = books.Concat(new[] {b}); 

ma mi dà questo errore su ultima riga di codice:

System.ArgumentNullException: valore non può essere null. Nome parametro: prima

sembra che nullCollection non poteva concatenato. Io uso EF, quindi come dovrei inizializzare il mio Collection che non ha nulla in esso e potrei concatenarlo?

+0

non è possibile eseguire il metodo 'Concat' su null – wudzik

+1

IEnumerable books = new List (); – Nick

+0

@wudzik Ok ora cosa dovrei fare invece? –

risposta

52

Tutto ciò che si vuole fare è filtrare il contesto. Libri secondo alcuni criteri.

IEnumerable<Book> books = context.Books.Where(b => someConditions); 

Se hai ancora bisogno del vuoto IEnumerable si può chiamare Enumerable.Empty():

IEnumerable<Book> books = Enumerable.Empty<Book>(); 
+0

Vorrei poter dare 100 punti per questo! – ali

19
IEnumerable<Book> books = new List<Book>(); 
+0

Grazie questo funziona impressionante, per i modelli EDMX anche –

0

È necessario creare libri come oggetto IEnumerable come Elenco, ma è necessario ricordare di chiamare, dopo il ciclo, ToList() sui libri. Per esempio:

 IEnumerable<int> books = new List<int>(); 
     IEnumerable<int> books2 = new int[] { 1, 2, 3, 4 }; 


     foreach (int b in books2) 
      if (b > 2) 
       books = (new[] { b }).Concat(books); 

     books = books.ToList(); 
+3

o utilizzare Enumerable.Empty () come Vyacheslav Volkov cui sopra. –

4

Personalmente vorrei solo andare con:

IEnumerable<Book> books = new Book[0]; 

piuttosto che utilizzare un elenco.

+0

Anche se sarei ancora usare '' Enumerable.Empty piuttosto che questo, perché evita la creazione di nuove istanze di array, questo è ancora meglio di creare un '' lista come per la risposta accettata perché non v'è un'ottimizzazione in .net che le cache Enumeratori per array di lunghezza zero! – AnorZaken

+0

@AnorZaken Sono d'accordo che '' Enumberable.Empty sarebbe meglio (dal momento che è più descrittivo), ma nota che lo fa ancora (pigramente) creare un array vuoto. –

+0

Sì, ma lo fa solo una volta per ogni tipo T, utilizzando il sistema di tipi e JIT per renderlo pigro e memorizzato nella cache (campo statico di sola lettura generico). Quindi "Enumerable.Empty" è ancora in primo piano. (Non sappiamo quante volte quella linea sarà chiamata - forse 1000 volte al secondo, solo OP lo sa.) – AnorZaken

1

Questo è ciò che si sta cercando di fare:

IEnumerable<Book> books = Enumerable.Empty<Book>(); 
books = books.Concat(context.Books.AsEnumerable().Where(b => someCondition)); 

In alternativa si può fai questo se vuoi iniziare da null:

IEnumerable<Book> books = null; 
var moreBooks = context.Books.AsEnumerable().Where(b => someCondition); 
books = books == null ? moreBooks : books.Concat(moreBooks); 

... anche se ho diverse domande sul motivo per cui vuoi/devi fare le cose in questo modo.

Problemi correlati