私は無数のオブジェクトを持っていますfoo
。
public IEnumerable<foo> listOfFoo{ get; set; }
FooにはIDがあり、名前で言うことができます。
IDをメソッドに渡したいのですが、メソッドはそのIDを持つオブジェクトをIEnumerableから削除して、それを返す必要があります。
それを行うための最良の方法は何ですか?
私は無数のオブジェクトを持っていますfoo
。
public IEnumerable<foo> listOfFoo{ get; set; }
FooにはIDがあり、名前で言うことができます。
IDをメソッドに渡したいのですが、メソッドはそのIDを持つオブジェクトをIEnumerableから削除して、それを返す必要があります。
それを行うための最良の方法は何ですか?
IEnumerable
は読み取り専用です。オブジェクトを1つから削除することはできません。
そうは言っても、あなたは次のようなことをすることができます
public Foo QuoteRemoveUnquoteById(int id)
{
var rtnFoo = listOfFoo.SingleOrDefault(f => f.Id == id);
if (rtnFoo != default(Foo))
{
listOfFoo = listOfFoo.Where(f => f.Id != id);
}
return rtnFoo;
}
一致するものをマスクするだけFoo
ですか?ただし、これにより、「削除」するアイテムが増えるほどパフォーマンスが低下します。また、への参照を保持する他のものはlistOfFoo
変更されません。
からアイテムを単純に削除することはできませんIEnumerable
。
ただし、基になるコレクションで変更を行うか(たとえば、それがaList
か何かであるかどうか)、IEnumerable
usingWhere
句をフィルタリングすることができます。
アイテムを削除する必要がある場合は、のようなアイテムの削除をサポートするコレクションを使用する必要がありますList<>
。
たとえば、バッキングフィールドのタイプを次のようにすることができますList<foo>
。
private List<foo> _listOfFoo;
public IEnumerable<foo> listOfFoo
{
get { return _listOfFoo.AsReadOnly(); }
set { _listOfFoo = value.ToList(); }
}
次に、からアイテムを削除します_listOfFoo
。
_listOfFoo.Remove(_listOfFoo.Single(foo => foo.ID == id_to_remove));
これは、を実装するコレクションでは不可能ですIEnumerable<foo>
。たとえばaの場合List<foo>
、そのアイテムを削除することはできますが、たとえばaの場合、アイテムを削除することfoo[]
はできません。
List<foo>
代わりに使用する場合:
public foo Extract(int id) {
int index = listOfFoo.FindIndex(x => x.Id == id);
foo result = listOfFoo[index];
listOfFoo.removeAt(index);
return result;
}
IEnumarableは、コレクションを反復処理するためのインターフェイスであり、ある種のコレクションにキャストせずにアイテムを削除する方法はありません。
ここでもっと読む:
http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx