0

Listクラスで作業しているときに、探していたブール値が次のとおりであることに気付きました。

 if(lstInts.Exists(x)){...}

Xは、lstIntsと同じTの述語です。この場合、なぜintをintに渡せないのか、Xの型がT型ではないのかについて混乱しました。

例iはテストしていました:

List<int> listInt = new List<int>();
int akey = Convert.toInt32(myMatch.Value);
Predicate<int> pre = new Predicate<int>(akey);  //akey is not the correct constructor param.
if(listInt.Exists(pre)){
   listInt.add(akey);
}

述語の追加のステップがある理由はありますか、または....ロジックについて間違っている場合はどうなりますか?

また、述語構造がタイプTのアイテムを受け取らないことに気づきました。これがどのように機能すると想定されるかについて、ある種混乱しています。

4

4 に答える 4

3

Contains()メソッドを使用することもできます

List<int> listInt = new List<int>();
int akey = Convert.toInt32(myMatch.Value);

if(listInt.Contains(akey)){
  listInt.add(akey); 
}

または代わりにAny()を使用します

if(listInt.Any(I => I == akey)) { 
  // Do your logic 
}
于 2012-09-06T19:23:05.677 に答える
2

Predicate<T>は、何らかの条件に一致する項目を見つけることができるデリゲート ( を返すbool) です (そのため、チェック対象の項目が引数として渡されます)。

于 2012-09-06T19:23:21.887 に答える
2

HashSet<T>これは、重複を許可しないコレクション型の適切な使用法です(ただ黙ってそれらを無視します)。

于 2012-09-06T19:25:27.047 に答える
1

さて、あなたのシナリオでは、クラスでContainsメソッドを使用する必要があります。List

では、あなたが尋ねるかもしれない存在の目的は何ですか? さて、Containsメソッドはオブジェクトのメソッドを使用して、Equalsチェックしているアイテムがリストに含まれているかどうかを判断します。Equalsこれは、クラスが等価性チェックのメソッドをオーバーライドした場合にのみ機能します。そうでない場合、同等と見なされるものの 2 つの別個のインスタンスは、同等とは見なされません。

Equalsそれに加えて、メソッドが提供する別のロジックを使用したい場合があります。現在、何かがリストにあるかどうかを判断する唯一の方法は、それを自分で反復するか、独自の EqualityComparer を記述してインスタンスの等価性をチェックすることです。

したがって、リスト クラスがExists行うことは、定型的な反復を行いながら、独自のロジックを簡単な方法で提供できるように、いくつかのメソッドを公開することです。

タイプのリストがあるとしDogます。現在、犬のクラスはEqualsメソッドをオーバーライドしているため、犬が別の犬と等しいかどうかを確認する方法はありませんが、犬の名前や所有者など、犬に関する情報がいくつかあります。したがって、次のことを検討してください

List<Dog> dogs = new List<Dog> {
    new Dog { Name = "Fido", Owner = "Julie" },
    new Dog { Name = "Bruno", Owner = "Julie" },
    new Dog { Name = "Fido", Owner = "George" }
};

Dog fido = new Dog { Name = "Fido", Owner = "Julie" };
  • List.Contains(fido)
    • false を返します (Equalsメソッドがオーバーライドされていないため)
  • List.Exists(x => fido.Name == x.Name && fido.Owner == x.Owner)
    • 文字列であり、等価性がオーバーライドされているプロパティの等価性をチェックしているため、true を返します。

リスト クラスのソース コードを見ると、おそらく次のようになります。

public bool Exists(Predicate<Dog> predicate) {
    foreach (Dog item in Items) {
        if (predicate(item))
            return true;
    }

    return false;
}

上記の述語を入力すると、メソッドは次のようになります

public bool Exists(Dog other) {
    foreach (Dog item in Items) {
        if (item.Name == other.Name && item.Owner == other.Owner)
            return true;
    }

    return false;
}
于 2012-09-06T19:42:07.690 に答える