22

habe ich versucht, diesen Code b zu books für das Hinzufügen von:Wie initialisiert man IEnumerable <Object>, die leer sind und Concat erlauben?

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

aber gibt mir diesen Fehler auf der letzten Codezeile:

System.ArgumentNullException: Wert nicht null sein kann. Parametername: erster

es scheint, dass nullCollection nicht verketteten konnte. Ich benutze EF, also wie sollte ich meine Collection initialisieren, die keine Sache darin haben und ich könnte damit verketten?

+0

Sie können die Methode 'Concat' nicht auf null ausführen – wudzik

+1

IEnumerable books = new Liste (); – Nick

+0

@wudzik Ok, was soll ich stattdessen tun? –

Antwort

52

Es scheint alles, was Sie tun möchten, filtern Sie Ihren Kontext.Bücher nach bestimmten Kriterien.

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

Wenn Sie noch das leere IEnumerable benötigen, können Sie einfach anrufen Enumerable.Empty():

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

Ich wünschte, ich könnte 100 Punkte dafür geben! – ali

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

Danke das funktioniert super, für edmx Modelle auch –

0

Sie benötigen Bücher als IEnumerable leeres Objekt wie List erstellen, müssen aber denken Sie daran, rufen nach Schleife, ToList() auf Bücher. Zum Beispiel:

 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

Oder verwenden Sie Enumerable.Empty () wie Vyacheslav Volkov oben erwähnt. –

4

Persönlich würde ich einfach mit:

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

anstatt eine Liste mit.

+0

Obwohl ich 'Enumerable.Empty ' immer noch verwenden würde, weil es das Erstellen neuer Array-Instanzen vermeidet, ist dies immer noch besser als das Erstellen einer 'Liste 'gemäß der akzeptierten Antwort, da es eine Optimierung in .net gibt Enumeratoren für Arrays mit null Länge! – AnorZaken

+0

@AnorZaken Ich stimme zu, dass 'Enumberable.Empty ' wäre besser (da es beschreibender ist), aber beachten Sie, dass es immer noch (träge) ein leeres Array erstellen. –

+0

Ja, aber es tut nur einmal für jeden Typ T, mit dem Typ-System und JIT, um es faul und zwischengespeichert (generisches statisches readonly Feld). So kommt 'Enumerable.Empty' immer noch an die Spitze. (Wir wissen nicht, wie oft diese Zeile aufgerufen wird - vielleicht 1000 Mal pro Sekunde, nur OP weiß.) – AnorZaken

1

Dies ist, was Sie zu tun versuchen:

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

Alternativ können Sie Tun Sie dies, wenn Sie von Null beginnen möchten:

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

... obwohl ich mehrere Fragen habe, warum du so etwas machen willst/musst.