s.CompareTo("a")>0)) "> s.CompareTo("a")>0)) "> s.CompareTo("a")>0)) " />

LINQを使用して特定の基準でリストのサブセットを削除する方法

Following code will throw runtime exception "Collection was modified; enumeration operation may not execute."

List l = new List();
l.Add("a");
l.Add("b");
l.Add("c");
foreach (string s in l.Where(s => s.CompareTo("a")>0))
    l.Remove(s);
1

4 答え

コレクションを列挙している間はコレクションからアイテムを削除することはできません。

In this case, I'd use List.RemoveAll:

l.RemoveAll(s => s.CompareTo("a")>0);
4
追加された
@ user1105127 IEnumerable は編集できないため、要素を削除しません。代わりに、 Enumerable.Where()を使用してコレクションをフィルタリングして新しい変数に割り当てる(または IEnumerable に再割り当てする) >
追加された 著者 Reed Copsey,
ありがとう、これは私が必要なものです。型がIList ではなくIEnumerable である場合の任意の提案ですか?
追加された 著者 user1105127,

何らかの条件でフィルタリングすることが何を意味しているのか、何らかの条件でフィルタリングすることが何を意味するのかを考える必要があります。 (ヒント:彼らは論理的に反対です)あなたがしていることは、はるかに畳み込まれた言い方です:

var result = l.Where(s => ! (s.CompareTo("a")>0));
2
追加された
ありがとう、私の場合、私は新しい結果を得るよりも、インプレース除去が必要です。
追加された 著者 user1105127,

通常、foreachループ内のコレクションには削除や追加ができません。探している結果を返すようにwhere句を設定するだけです。

List l = new List();
l.Add("a");
l.Add("b");
l.Add("c");

// notice that the where clause is opposite of what you had before
l = list.Where( s=> s.CompareTo("a") <= 0 ).ToList(); 
1
追加された
これは、最後に.ToList()を必要とします...
追加された 著者 Reed Copsey,
あなたはコンパイルするようにあなたの例を修正すべきです、少なくとも...
追加された 著者 Reed Copsey,
うん、私は知っている...ちょうどいくつかのサンプルコードは、アイデアを表示する
追加された 著者 Muad'Dib,

一番簡単なことは、linqクエリの後に ToList を実行することです。何かのようなもの

List l = new List();
l.Add("a");
l.Add("b");
l.Add("c");
l = l.Where(s => s.CompareTo("b") > 0).ToList();

l will only contain c in the end.

また、 Jon のように、リストには RemoveAll もありますあなたが使うことができる方法

l.RemoveAll(s => s.CompareTo("b") <= 0);

does the same thing as above but notice the logic has flipped but technically you are not using linq

1
追加された
それはできるだけ簡単に呼び出すことができますが、それは非常に無駄な解決策です。
追加された 著者 Jon,