web-dev-qa-db-ja.com

空のIEnumerable <Object>を初期化し、それを連結する方法は?

bbooksに追加するためにこのコードを試しました。

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

しかし、コードの最後の行にこのエラーが表示されます:

System.ArgumentNullException:値をnullにすることはできません。パラメーター名:最初

nullCollectionは連結できなかったようです。 EFを使用しているので、何も含まれていないCollectionを初期化する必要があり、連結できますか?

29
Majid

いくつかの基準でcontext.Booksをフィルター処理するだけです。

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

それでも空のIEnumerableが必要な場合は、Enumerable.Empty()を呼び出すことができます。

IEnumerable<Book> books = Enumerable.Empty<Book>();
71
Rodrigo López
IEnumerable<Book> books = new List<Book>();
23
chris.ellis

個人的に私はちょうど行く:

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

リストを使用するのではなく。

4
Matthew Watson

これはあなたがやろうとしていることです:

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

または、nullから開始する場合はこれを実行できます。

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

...あなたがこのように物事をしたい/必要な理由についていくつか質問がありますが。

2
AnorZaken

ListのようなIEnumerableの空のオブジェクトとしてブックを作成する必要がありますが、ループの後にブックのToList()を呼び出すことを忘れないでください。例えば:

        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();
0
Jakub Dropia