C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のSortedSetから述語(条件)に一致する要素を削除する方法

C#のSortedSet<T>から、指定した条件(述語)に一致する要素をまとめて削除したい場合は、RemoveWhere()メソッドを使用します。このメソッドはPredicate<T>デリゲートを引数として受け取り、その条件がtrueを返すすべての要素をコレクションから取り除きます。戻り値として、実際に削除された要素の数がint型で返される点も覚えておくと便利です。

RemoveWhere()メソッドの基本構文

public int RemoveWhere (Predicate<T> match);

引数のmatchには、削除対象かどうかを判定するための述語(boolを返すメソッドやラムダ式)を渡します。判定メソッドがtrueを返した要素だけがSortedSetから削除されます。

例1:10の倍数に一致する要素をすべて削除する

まずは、10で割り切れる(10の倍数である)要素をすべて削除するサンプルを見てみましょう。

using System;
using System.Collections.Generic;

public class Demo {
    private static bool demo(int i) {
        return ((i % 10) == 0);
    }
    public static void Main(String[] args) {
        SortedSet<int> set1 = new SortedSet<int>();
        set1.Add(200);
        set1.Add(215);
        set1.Add(310);
        set1.Add(500);
        set1.Add(600);

        Console.WriteLine("SortedSetの要素...");
        foreach (int i in set1) {
            Console.WriteLine(i);
        }
        Console.WriteLine(" ");

        set1.RemoveWhere(demo);

        Console.WriteLine("要素を削除した後のSortedSet...");
        foreach (int i in set1) {
            Console.WriteLine(i);
        }
    }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

SortedSetの要素...
200
215
310
500
600

要素を削除した後のSortedSet...
215

この例では、200・310・500・600がいずれも10の倍数に該当するため削除され、条件に一致しない215のみが残ります。SortedSetは常にソートされた状態を保つため、削除後も要素は昇順に並んでいます。

例2:特定の値に一致する要素を1つだけ削除する

続いて、述語の条件を「値が500と等しい」に変更した例です。SortedSetは重複した要素を持たないため、この条件では最大でも1つの要素が削除されます。

using System;
using System.Collections.Generic;

public class Demo {
    private static bool demo(int i) {
        return (i == 500);
    }
    public static void Main(String[] args) {
        SortedSet<int> set1 = new SortedSet<int>();
        set1.Add(200);
        set1.Add(215);
        set1.Add(310);
        set1.Add(500);
        set1.Add(600);

        Console.WriteLine("SortedSetの要素...");
        foreach (int i in set1) {
            Console.WriteLine(i);
        }
        Console.WriteLine(" ");

        set1.RemoveWhere(demo);

        Console.WriteLine("要素を削除した後のSortedSet...");
        foreach (int i in set1) {
            Console.WriteLine(i);
        }
    }
}

出力結果

実行すると、次の出力が得られます。

SortedSetの要素...
200
215
310
500
600

要素を削除した後のSortedSet...
200
215
310
600

条件「i == 500」に一致した500だけが削除され、それ以外の要素はそのまま残っていることが確認できます。

ポイントまとめ

  • RemoveWhere()は、述語(Predicate<T>)に一致するすべての要素をSortedSetから一括削除できる。
  • 戻り値として削除された要素の個数が返されるため、削除件数のログ出力などにも活用できる。
  • ラムダ式を使えば、set1.RemoveWhere(i => i % 10 == 0);のように簡潔に記述することも可能。
  1. C#のRemoveAllメソッドで述語に一致するリストの全要素を削除する方法

    C#では、List<T>.RemoveAll()メソッドを使用することで、述語(Predicate)で定義された条件に一致するすべての要素を、リストから一度に削除できます。条件に合致する要素が複数あっても、自分でループを書く必要はありません。 RemoveAllメソッドとは RemoveAllメソッドは、引数としてPredicate<T>デリゲートを受け取ります。このデリゲートがtrueを返す要素だけがリストから削除され、削除された要素の個数が戻り値として返されます。 例1:値「500」の要素をすべて削除する まずは、リスト内の「500」という値を持つ要素をすべて削除す

  2. C#で配列内に指定した条件に一致する要素が含まれているか確認する方法

    C#で配列の中に、特定の条件に一致する要素が1つでも存在するかどうかを確認したい場合があります。そんなときに便利なのが Array.Exists() メソッドです。このメソッドは、第1引数に検索対象の配列、第2引数に条件を表す述語(Predicate)デリゲートを渡します。たとえば文字列の前方一致を調べたい場合は、StartsWith() メソッドと組み合わせることで簡単に実現できます。以下では、具体的なサンプルコードとその実行結果を通じて、使い方を詳しく見ていきましょう。サンプルコード:StartsWith()で前方一致を判定するusing System; public class Demo