0

我面临一个非常奇怪的问题。我有一个列表,并试图从以下 for 循环中更新其内部结构字段之一。

foreach (var item in AppUserDetail )
            {
                int AppUserID = item.AppUserId;
                List<int> list = templateCategory.AppUserTemplateCategorySecurityGroupXrefs.Where(a => a.AppUserId == AppUserID).Select(b => b.SecurityGroupId).ToList();

                item.AppUserSecurityGroupXrefs.Where(a => list.Contains(a.SecurityGroupId)).Select(b => b.SecurityGroup).Select(c =>  c.Selected = true);
                bool s = item.AppUserSecurityGroupXrefs.Where(a => list.Contains(a.SecurityGroupId)).Select(b => b.SecurityGroup).Select(c => c.Selected).FirstOrDefault();

             }
return AppUserDetail;

在循环的第三行,您可以看到我使用 select 本身将值更改为 True。当我运行应用程序时,返回对象上的值看起来没有变化。但是,如果我们通过在循环中放置一个断点来在即时窗口中执行同一行,它会更新 Data 并反映在返回的对象AppUserDetail 上。我真的很困惑为什么它只能从即时窗口更新,而不是直接执行代码。

item.AppUserSecurityGroupXrefs.Where(a => list.Contains(a.SecurityGroupId)).Select(b => b.SecurityGroup).Select(c => c.Selected = true);

4

1 回答 1

1
item.AppUserSecurityGroupXrefs.Where(a => list.Contains(a.SecurityGroupId)).Select(b => b.SecurityGroup).Select(c =>  c.Selected = true);

Select是懒惰的,因为没有枚举它返回的可枚举对象,因此不会执行任何操作。即时窗口隐式枚举结果以显示它,但这通常不会在构建的代码中发生。

(即使它是,目的Select是返回一个新对象——传入对象的投影——而不是修改某些东西。因此很可能很奇怪。)

我认为您真的想要一个Enumerable.ForEach旨在处理 LINQ 表达式结果的扩展。您自己的实现非常简单。

于 2018-01-10T13:21:17.923 回答