0

所以我有一堆 UltraTreeNodes。我正在尝试遍历它们并将 LINQ 查询分配给 Tag 属性,该属性将在稍后用户单击节点时执行。对每个节点的查询唯一改变的是 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 回答