72

ポップアップ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 ??????
   }
}

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

4

9 に答える 9

67

削除するのではListなく、LINQ を使用してその要素なしで新しいものを作成します。

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

// new list
var modified = users.Where(u => u.userId == 123).ToList();
于 2013-01-03T16:58:04.997 に答える
27

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

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

詳細については、 http ICollection//msdn.microsoft.com/en-us/library/92t2ye13.aspxを参照してください。

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

ICollectionおそらく行く方法です。

于 2013-01-03T16:57:18.863 に答える
12

IEnumerableをに変えてみてくださいListListこの時点から、の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
于 2013-01-03T16:57:20.750 に答える
3

できません。IEnumerable<T>繰り返すことしかできません。

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

foreach(var u in users.ToArray()) // ToArray creates a copy
{
   if(u.userId != 1233)
   {
        users.Remove(u);
   }
}
于 2013-01-03T16:57:09.237 に答える
0

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

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

暗黙のキャストなしでコードを使用してみませんか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);
   }
}
于 2013-01-03T16:58:15.603 に答える
0

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

于 2013-01-03T16:59:14.287 に答える