web-dev-qa-db-ja.com

IEnumerable <T>コレクションからアイテムを削除します

ポップアップされたIEnumerable<User>コレクションがあります。

アイテムを削除したいのですが、どうすればいいですか?

foreach(var u in users)
{
  if(u.userId = 1123)
  {
    // remove!
  }
}

ループ中に削除することを想定していないので、新しいコレクションを作成したり、後で削除したりしてもかまいません。

しかし、アイテムを削除する方法がわかりません。何らかの理由でこれが失われました!

私が混乱している代わりに、次のような新しいコレクションを作成するにはどうすればよいですか?

IEnumerable<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        modifiedUsers.add ??????
   }
}

コレクションに追加するにはどうすればよいですか?

43
loyalflow

削除せず、LINQを使用してその要素なしで新しいListを作成します。

// remove
users = users.Where(u => u.userId != 123).ToList();

// new list
var modified = users.Where(u => u.userId == 123).ToList();
42
lante

IEnumerableからアイテムを削除することはできません。ここで説明されているように、列挙のみが可能です。 http://msdn.Microsoft.com/en-us/library/system.collections.ienumerable.aspx

アイテムを追加および削除する場合は、ICollectionを使用する必要があります。たぶん、あなたはIEnumerable;を試してみてください。これはもちろん、基礎となるオブジェクトがICollection`を実装している場合にのみ機能します。

ICollectionの詳細については、こちらをご覧ください。 http://msdn.Microsoft.com/en-us/library/92t2ye13.aspx

もちろん、lanteで指摘されているように、IEnumerableから新しいリストを作成することもできますが、実際のユースケースによっては、これが「最適ではない」場合もあります。

ICollectionがおそらく道です。

16

IEnumerableListに変えてみてください。この時点から、ListRemoveメソッドを使用してアイテムを削除できるようになります。

Linqを使用してRemoveメソッドにパラメーターとして渡すには、次のメソッドでアイテムを取得できます。

  • users.Single(x => x.userId == 1123)
  • users.First(x => x.userId == 1123)

コードは次のとおりです。

users = users.ToList(); // Get IEnumerable as List

users.Remove(users.First(x => x.userId == 1123)); // Remove item

// Finished
9
dutzu

できません。 IEnumerable<T>は反復のみ可能です。

2番目の例では、元のコレクションのコピーを反復処理することにより、元のコレクションから削除できます。

foreach(var u in users.ToArray()) // ToArray creates a copy
{
   if(u.userId != 1233)
   {
        users.Remove(u);
   }
}
2
Tilak

IEnumerable<T>要素を削除することはできませんが、 Enumerable.Skip Method を使用できます

0
spajce

IEnumerableインターフェイスは列挙可能なものです-AddRemoveにメソッドを提供したり、リストを変更したりすることは一切ありません。

インターフェースは、いくつかの項目を反復する方法を提供するだけです-列挙を必要とするほとんどの実装は、List<T>などのIEnumerableを実装します

IEnumerableへの暗黙的なキャストなしでコードを使用しないのはなぜですか

// Treat this like a list, not an enumerable
List<User> modifiedUsers = new List<User>();

foreach(var u in users)
{
   if(u.userId != 1233)
   {
        // Use List<T>.Add
        modifiedUsers.Add(u);
   }
}
0
Charleh