1

LINQ 句で整数変数を使用し、whereクエリの実行後に整数変数を変更または初期化すると、LINQ クエリの結果セットが変更されます。例えば:

static void Main(string[] args)
{    
     int startPos = 0;          
     List<string> intList = new List<string>();
     for (int i = 0; i < 10; i++)
     {
        intList.Add(i.ToString());
     }

     var qResult = from c in intList
                   where Convert.ToInt32(c) >= startPos
                   select c;

     // prints count as 10
     Console.WriteLine("List count is :"+qResult.Count());

     startPos = 5;

     // prints count as 5
     Console.WriteLine("List count is :" + qResult.Count());
}

出力:

List count is :10
List count is :5

startPos = 5;上記の例では、 の後にqResultが変更されていることがわかります。これがどのように起こったのか理解できません。私の知る限り、int値型です。

Linq クエリは行で再度実行されますstartPos = 5;か? はいの場合、パフォーマンスへの影響はありますか? そして最も重要なことは、ここで何か不足していますか?

4

5 に答える 5

1

これは、を呼び出すたびに and が実行されるqResultためです。結果が変わらないようにしたい場合は、次のように使用します。IEnumerable<T>.Count()ToList()

var qResult = (from c in intList
               where Convert.ToInt32(c) >=startPos
               select c).ToList();
于 2013-07-31T10:19:37.867 に答える
0

linq クエリは、遅延読み込みを使用するため、呼び出し時に実行されます。あなたの場合qResult.Count()、実行呼び出しを強制したい場合ToList()、または同様の関数でクエリが実行されます。

于 2013-07-31T10:19:16.157 に答える
0

はい、これは、qResult呼び出すたびに列挙され、変更されたクロージャーに linq クエリにCount()アクセスしているためです。この動作を回避するには、3 番目の変数を使用する必要があります。

        int pos = startPos;
        var qResult = from c in intList
                      where Convert.ToInt32(c) >= pos
                      select c;

またはその場で列挙します:

        var qResult = (from c in intList
                      where Convert.ToInt32(c) >= startPos
                      select c).ToArray();

遅延実行と呼ばれる

于 2013-07-31T10:19:34.150 に答える