如何在LINQ中重写C#foreach

如何在LINQ中重写C#foreach,c#,linq,C#,Linq,当我构建以下内容时,出现错误无法修改“pd”的成员,因为它是“foreach迭代变量” foreach (var w in tt.Weeks) foreach (var d in w.Days) foreach (var pd in d.Periods) if (pd.Type == TimetablePeriod.Types.Registration) pd.ClassId = clsId; 我理解为什么会发生这个错误,但我正在尝试一种简洁的方法来重写代码。我可以使用

当我构建以下内容时,出现错误
无法修改“pd”的成员,因为它是“foreach迭代变量”

foreach (var w in tt.Weeks)
  foreach (var d in w.Days)
    foreach (var pd in d.Periods)
      if (pd.Type == TimetablePeriod.Types.Registration) pd.ClassId = clsId;
我理解为什么会发生这个错误,但我正在尝试一种简洁的方法来重写代码。我可以使用嵌套的
进行
循环,但是有好的LINQ解决方案吗


(如果不清楚,我正在尝试将所有周中所有天的所有时段的
ClassId
设置为
clsId
,无论
PeriodType
TimetablePeriod.Types.Registration

请尝试以下代码

您的问题与@CodeInChaos提到的代码是否为LINQ无关。由于
pd
是结构类型,您需要替换它以设置值(clsId)

foreach(以tt.周为单位的var w)
{
foreach(var d,以w.天为单位)
{
对于(int i=0;i
请尝试以下代码

您的问题与@CodeInChaos提到的代码是否为LINQ无关。由于
pd
是结构类型,您需要替换它以设置值(clsId)

foreach(以tt.周为单位的var w)
{
foreach(var d,以w.天为单位)
{
对于(int i=0;i
我假设您有这样一个
结构:

public struct Period
{
    public SomeType ClassId{get;set;}
}
这意味着使用LINQ或
foreach
对集合进行的任何迭代都将在值的副本上工作。因此,如果您修改它们,您只会修改一个临时副本,然后该副本将被丢弃。原始结构将保持不变

出于这一点和许多其他原因,除非您有很好的理由使用可变结构,否则应该避免使用它们。(搜索“可变结构邪恶”,你会发现很多)

在您的情况下,您可以简单地用类替换
struct
。然后得到引用语义

或者您可以使用for循环,它提供直接访问。但它仍然不会使用朴素的实现进行编译:

for(int i=i;i<list.Count;i++)
  list[i].ClassId=something;

for(inti=i;i我假设您有一个类似这样的
struct

public struct Period
{
    public SomeType ClassId{get;set;}
}
这意味着使用LINQ或
foreach
对集合进行的任何迭代都将对值的副本起作用。因此,如果修改它们,则只修改一个临时副本,然后该副本将被丢弃。原始结构将保持不变

出于这一点和许多其他原因,除非你有很好的理由使用可变结构,否则应该避免使用它们

在本例中,您可以简单地用类替换
struct
,然后获得引用语义

或者,您可以使用for循环,它为您提供了直接访问权限。但它仍然无法使用naive实现进行编译:

for(int i=i;i<list.Count;i++)
  list[i].ClassId=something;

for(int i=i;iIs
pd
一个可变结构?这个代码应该编译一个类。它是一个结构,但是ClassId有一个公共setter,所以肯定可以吗?你需要使用
for
。或者用一个类替换你的结构。CodeInChaos请提交你的评论作为答案,这样我就可以向上投票=)强烈建议:如果您不确定值类型和引用类型之间的差异,请尽量避免使用
struct
。在获得更多经验之前,请坚持使用
class
pd
是可变结构吗?对于类,此代码应该编译。它是一个结构,但ClassId肯定有一个公共setter好吗?您需要为
使用
。或者用类替换您的结构。CodeInChaos请提交您的评论作为答案,以便我可以投票=)强烈建议:如果您不确定值类型和引用类型之间的差异,请避免使用
struct
。坚持学习
课程
,直到获得更多经验。