[解決済み] c#の述語とは何ですか?[重複しています]
質問
述語を使うのはとても初めてで、書き方を覚えたばかりです。
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);
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プログラム実行中に1秒待つ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】C#はJavaのcharAt()と同等?)
-
[解決済み] DBNullから他の型にオブジェクトをキャストすることができない
-
[解決済み】バックスラッシュを含むパス文字列のエスケープシーケンスが認識されない件
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み】データが存在しないのに読み込もうとする試みが無効である
-
[解決済み】C#の述語デリゲート