4

私がやろうとしているのは、リスト B のすべての要素がリスト A にあるかどうかを確認することだけです

        if (listA.All(element => listB.Contains(element))
        {
            return;
        }

誰かがこれがうまくいくと言って別の解決策を思いついた、そしてそれはうまくいった!

       if (listA.All(listB.Contains))
            return;

さて、(私はそれが機能することを知っています)、

  1. コンパイラが 2 番目のメソッドで () の近くに () を必要としないのはなぜですか?
  2. 将来、たとえば、これを大文字と小文字を区別せずに比較したい場合、2番目の方法でどのようにしますか?

前もって感謝します。

4

1 に答える 1

13

このAllメソッドは、パラメーターとして述語を要求します。Func<T, bool>ここTで、 は同じ型で、 内のアイテムList<T>です。このコードは、そのようなメソッドを提供しているため機能します。このAllメソッドは、リスト内の各項目に対して提供された述語を呼び出した結果が になるかどうかを示す値を返しますtrue。パラメータは、必要な に一致するメソッドへの参照であり、単一のパラメータを取り、を返します。ContainsFunc<T, bool>Tbool

次の 2 行のコードを検討してください。

Func<string, bool> predicate1 = s => s.Length > 5;
Func<string, bool> predicate2 = listB.Contains;

代入演算子の右側にある式は、1 つのstringパラメーターを取り、bool. メソッドにpredicate1またはpredicate2を渡すことができます。All最初に変数に格納されて変数が渡されるのではなく、述語が直接渡されることを除いて、提供したコードと同じです。

ただし、Containsメソッドは実際にはパラメーターとして呼び出されません。メソッドによって内部的にのみ呼び出されAllます。

大文字と小文字を区別しない検索を行い、上記と同じ種類の構文を使用する場合は、大文字と小文字を区別しない検索を実行するメソッドが必要になりますただし、カスタムの匿名メソッドをいつでも使用できます。

listA.All(x => listB.Any(
    z => string.Equals(x, z, StringComparison.OrdinalIgnoreCase)));
于 2013-07-01T12:28:37.300 に答える