5

重複の可能性:
c#:IEnumerable内のアイテムを削除するにはどうすればよいですか?

私は無数のオブジェクトを持っていますfoo

 public IEnumerable<foo> listOfFoo{ get; set; }

FooにはIDがあり、名前で言うことができます。

IDをメソッドに渡したいのですが、メソッドはそのIDを持つオブジェクトをIEnumerableから削除して、それを返す必要があります。

それを行うための最良の方法は何ですか?

4

4 に答える 4

5

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変更されません。

于 2012-09-28T08:34:32.677 に答える
3

からアイテムを単純に削除することはできませんIEnumerable


ただし、基になるコレクションで変更を行うか(たとえば、それがaListか何かであるかどうか)、IEnumerableusingWhere句をフィルタリングすることができます。

アイテムを削除する必要がある場合は、のようなアイテムの削除をサポートするコレクションを使用する必要があります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));
于 2012-09-28T08:34:51.843 に答える
2

これは、を実装するコレクションでは不可能です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;
}
于 2012-09-28T08:35:20.427 に答える
2

IEnumarableは、コレクションを反復処理するためのインターフェイスであり、ある種のコレクションにキャストせずにアイテムを削除する方法はありません。

ここでもっと読む:

http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx

于 2012-09-28T08:36:23.887 に答える