7

IEnumerableリストから要素を削除することはできませんが、このリストは、他のクラスのプライベート属性であるListへの参照です。personsCollection.Remove(theElement)同じクラス(クラスマネージャー)に入れると完璧に動作しますが、他のクラス(クラスマネージャー削除)から要素を削除する必要があります。どうすればこれができますか?ありがとう。

class Other
{
  //Some code
  public IEnumerable<Person> SearchByPhone (string value)
    {
        return from person in personCollection
               where person.SPhone == value
               select person;
    }
 }

class ManagerDelete
{ 
//Some code
IEnumerable<Person> auxList= SearchByPhone (value);
//I have a method for delete here  
}

class Manager
{ 
//Some code
 private List<Person> personsCollection = new List<Person>();
}
4

7 に答える 7

12

アイテムを直接追加/削除するIEnumerable<T>タイプにする必要があるから削除することはできません。IList<T>

于 2013-03-27T13:13:37.930 に答える
4

インターフェイスで何ができるかを理解する必要がありIEnumerableます。

さまざまな状況で必要な場合に、設計上使用する必要のあるインターフェイスのリストを以下に示します。あなたの例IListでは、あなたが使用する必要があるものです。

  • ICollectionすべての非汎用コレクションタイプの一般的な特性(サイズ、列挙、スレッドセーフなど)を定義します。

  • ICloneable実装オブジェクトがそれ自体のコピーを呼び出し元に返すことを許可します。

  • IDictionary非ジェネリックコレクションオブジェクトが、
    キーと値のペアを使用してその内容を表すことを許可します。

  • IEnumerable IEnumeratorインターフェイスを実装するオブジェクトを返します(次のテーブルエントリを参照)。

  • IEnumeratorコレクションアイテムのforeachスタイルの反復を有効にします。

  • IList
    オブジェクトのシーケンシャルリスト内のアイテムを追加、削除、およびインデックス付けする動作を提供します。

于 2013-03-27T13:21:31.480 に答える
3

ダレンは正しいです。リストに変換せずに、次のことができます。

personCollection = personCollection.Except(SearchByPhone(value));

ManagerDeleteで。

于 2013-03-27T13:18:55.523 に答える
2

を使用ToListしてをに変換してIEnumerableから、Listそこから何かを削除することができます。

var auxList= SearchByPhone (value).ToList();
auxList.Remove(something);
于 2013-03-27T13:27:51.743 に答える
1

にキャストできIEnumerableますIList。これは、IEnumerableが実際にである場合に機能しListます。ただし、これは悪い設計です。アイテムを削除する場合は、リストをでIListはなく、として公開する必要がありIEnumerableます。

于 2013-03-27T13:17:26.140 に答える
1

AnIEnumerableは文字通り、言うための単なるインターフェースです。私はこのコレクションを持っています、あなたはそれを繰り返すことができます。

IEnumerableインターフェイスの実際の詳細を見ると、多くは含まれておらず、呼び出し元がそれを反復できるようにするメソッドのみが含まれています。

http://msdn.microsoft.com/en-gb/library/9eekhta0.aspx

Listタイプを使用してタイプを削除できる理由は、IEnumerableインターフェイスの上に構築されており、より多くの機能を提供するためです。これは、操作できるオブジェクトのコレクションを表すことになっています。一方、IEnumerableはこれを行うように設計されていません。

このメソッドは、実際には、以下も実装する基盤となるインターフェースRemoveに由来します。ICollectionList

http://msdn.microsoft.com/en-gb/library/bye7h94w.aspx

于 2013-03-27T13:18:06.930 に答える
1

他の答えに加えて:あなたのデータ構造の選択は適切ではないようです。コンテナから要素を削除することを本当に計画している場合、そもそもコンテナがである必要はありませんIEnumerable<>

次の選択肢を検討してください。

  • IEnumerable<>からに切り替えICollection<>ます;
  • 削除をフィルターアウト()に置き換え.Where()、別のフィルターを取得しIEnumerable<>ます。
于 2013-06-08T15:07:40.310 に答える