3

fruit述語の条件が true の場合、パラメーター (入力パラメーターであることがわかっている) が返されるかどうか混乱します。次のコードが示すように:

List<string> fruits = new List<string> {
    "apple",
    "passionfruit",
    "banana",
    "mango",
    "orange",
    "blueberry",
    "grape",
    "strawberry"
};

IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 8);
// query contains: {apple,banana,mango,orange,grape}

IEnumerable<string> query2 = query.Where(fruit => fruits.Contains("apple"));

foreach (string fruity in query2)
{
    Console.WriteLine(fruity);
}

// finally returns: {apple,banana,mango,orange,grape}

したがって、条件が真の場合、入力が返されるように見えます。

間違っていたらご指導よろしくお願いします

4

3 に答える 3

4

Where述語が返した入力のフィルタリングされたシーケンスを返しますtrue。それは各要素に順番に適用され、そのアイテムは譲られるか破棄されます。基本的:

public static IEnumerable<T>(this IEnumerable<T> source, Func<T,bool> predicate)
{
    foreach(var el in source) {
        if(predicate(el) {
            yield return el;
        }
    }
}

名前を見てください:

IEnumerable<string> query2 = query.Where(fruit => fruits.Contains("apple"));

つまり、すべてfruitの について、セット全体( fruits、最後の に注意s) がリンゴを返すかどうかを確認します。リストfruits には が含まれappleているため、すべての果物に当てはまります。

あなたはおそらく次のことを意味していました:

IEnumerable<string> query2 = query.Where(fruit => fruit.Contains("apple"));
于 2013-01-16T07:57:42.023 に答える
1

.Where ラムダを SQL クエリと考えることができます。

SELECT * FROM IEnumerable WHERE Predicate = TRUE;

私にとって、これはSQLのバックグラウンドのために好ましい方法です:)

于 2013-01-16T10:58:31.910 に答える
1

LINQ Where は、述語が true を返すすべての項目を含む IEnumerably セットを返します。

実行している 2 番目のクエリfruits.Contains("apple")では、基本的に常に true または常に false です。おそらく、次のことを行うつもりでした。

IEnumerable<string> query2 = query.Where(fruit => fruit == "apple");
//returns: {apple}
于 2013-01-16T07:58:36.580 に答える