ポップアップされた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 ??????
}
}
コレクションに追加するにはどうすればよいですか?
削除せず、LINQを使用してその要素なしで新しいList
を作成します。
// remove
users = users.Where(u => u.userId != 123).ToList();
// new list
var modified = users.Where(u => u.userId == 123).ToList();
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
がおそらく道です。
IEnumerable
をList
に変えてみてください。この時点から、List
のRemove
メソッドを使用してアイテムを削除できるようになります。
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
できません。 IEnumerable<T>
は反復のみ可能です。
2番目の例では、元のコレクションのコピーを反復処理することにより、元のコレクションから削除できます。
foreach(var u in users.ToArray()) // ToArray creates a copy
{
if(u.userId != 1233)
{
users.Remove(u);
}
}
IEnumerable<T>
要素を削除することはできませんが、 Enumerable.Skip Method を使用できます
IEnumerable
インターフェイスは列挙可能なものです-Add
やRemove
にメソッドを提供したり、リストを変更したりすることは一切ありません。
インターフェースは、いくつかの項目を反復する方法を提供するだけです-列挙を必要とするほとんどの実装は、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);
}
}