0

だから私はたくさんのUltraTreeNodeを持っています。それらを繰り返し処理して、後でユーザーがノードをクリックしたときに実行されるTagプロパティにLINQクエリを割り当てようとしています。各ノードのクエリで変更されるのは、where句の変数だけです。ただし、ノードがクリックされ、クエリが最終的にタグから実行されると、foreachループの最後に割り当てられたクエリ(およびwhere変数)が常に使用されます。

すべてのタグが同じクエリを参照しているため、変数が何度も割り当てられている場所で同じように動作しますか?その場で述語を作成してそれらを渡す必要なしに、この動作を回避する方法はありますか?

更新-申し訳ありませんが、コードは次のとおりです。

var query = from result in results
                    where result.SchedulingStatus != SchedulerRunStatus.Scheduled 
                    group result by result.UserId into users
                    select new {users.Key, Count = users.Count()};


        foreach (var user in query)
        {
            UltraTreeNode efdUserNode = new UltraTreeNode();
            efdUserNode.Text = user.Key + " (" + user.Count + ")";
            efdUserNode.Key = user.Key;
            IEnumerable<DownloadResultSummary> nodeQuery = from result in efdDetail.DownloadResultSummaries
                              where
                                  result.SchedulingStatus != SchedulerRunStatus.Scheduled &
                                  result.UserId == user.Key
                              select result;

            efdUserNode.Tag = nodeQuery;

            efdUserNode.Override.NodeAppearance.Image = Properties.Resources.user;
            this.efdNode.Nodes.Add(efdUserNode);
        }
4

1 に答える 1

3

foreachループの最後に割り当てられたクエリ(およびwhere変数)を常に使用します。

ループ変数を閉じている可能性があります-クエリは後で実行されるだけなので、その時点での変数の値を取得します-これは最後に割り当てられたものです。

foreach代わりに、ループ内にループ変数のローカルコピーを作成します。

foreach (var user in query)
{
   User localUser = user;
   //use localUser now instead
   //..
}

ループ変数を閉じている部分は次のとおりです。

   where result.SchedulingStatus != SchedulerRunStatus.Scheduled 
         && result.UserId == user.Key
        select result;

これを次のように置き換えます。

   where result.SchedulingStatus != SchedulerRunStatus.Scheduled 
         && result.UserId == localUser.Key
        select result;

詳細については、「有害と考えられるループ変数を閉じる」を参照してください。

于 2012-04-19T18:20:19.737 に答える