1. ホーム
  2. c#

[解決済み] c#の述語とは何ですか?[重複しています]

2022-05-09 14:24:25

質問

述語を使うのはとても初めてで、書き方を覚えたばかりです。

Predicate<int> pre = delegate(int a){ a %2 == 0 };

述語は何を返すのか、そしてプログラミングをするときにどう役に立つのか。

どのように解決するの?

Predicate<T> は関数構造で、基本的に与えられた T オブジェクトを作成します。

例えば、あるクラスがあったとします。

class Person {
    public string Name { get; set; }
    public int Age { get; set; }
}

さて、ここで List<Person> people で、その中にOscarという名前の人がいるかどうか知りたいのです。

なし を使用しています。 Predicate<Person> (あるいはLinqやその手の凝ったもの)を使えば、いつでも次のように達成できる。

Person oscar = null;
foreach (Person person in people) {
    if (person.Name == "Oscar") {
        oscar = person;
        break;
    }
}

if (oscar != null) {
    // Oscar exists!
}

これはいいのですが、例えば「Ruth」という名前の人がいるかどうかを調べたいとします。あるいは、年齢が17歳の人がいるかどうか?

を使って Predicate<Person> このようなことは、もっと少ないコードで見つけることができます。

Predicate<Person> oscarFinder = (Person p) => { return p.Name == "Oscar"; };
Predicate<Person> ruthFinder = (Person p) => { return p.Name == "Ruth"; };
Predicate<Person> seventeenYearOldFinder = (Person p) => { return p.Age == 17; };

Person oscar = people.Find(oscarFinder);
Person ruth = people.Find(ruthFinder);
Person seventeenYearOld = people.Find(seventeenYearOldFinder);

私はたくさん言ったことに注意してください コードを減らす ではなく、多くの より速く . 開発者がよく抱く誤解は、1行で済むものは10行で済むものよりも性能が良いに違いないというものです。しかし、舞台裏では Find メソッドは Predicate<T> は、結局のところ単なる列挙に過ぎない。Linqの多くの機能にも同じことが言えます。

では、質問にある具体的なコードを見てみましょう。

Predicate<int> pre = delegate(int a){ return a % 2 == 0; };

ここでは Predicate<int> pre を受け取り、それを int a を返し a % 2 == 0 . これは、基本的に偶数かどうかをテストしているのです。それが意味するところは

pre(1) == false;
pre(2) == true;

といった具合に。これはまた、もしあなたが List<int> ints で、最初の偶数を見つけたい場合は、こうすればいいのです。

int firstEven = ints.Find(pre);

もちろん、コード内で使用する他の型と同様に、変数にわかりやすい名前を付けるのは良いアイデアです。 pre を次のように変更します。 evenFinder または isEven -- といった具合に。そうすれば、上のコードはもっとわかりやすくなります。

int firstEven = ints.Find(evenFinder);