【问题标题】:Alternative to setting values in foreach C#在 foreach C# 中设置值的替代方法
【发布时间】:2016-08-23 09:01:58
【问题描述】:

我对 MVC/C# 比较陌生,据我了解,foreach 是只读的。

我希望有一个方法可以将 null 值设置为 false 如果调用该方法。

IQueryable<CurrentMatch> FindTheMatch = (from row in db.CurrentMatches
                                                 where row.UserId.ToString() == UserIdentity
                                                 where row.MatchID == MatchIdentity
                                                 select row);

        List<CurrentMatch> SetRemainingValuesToFalse = FindTheMatch.ToList();

我知道下面的部分行不通,它只是展示了我如何努力实现我想做的事情。

        foreach (var Column in SetRemainingValuesToFalse)
        {
            if (Column == null)
            {
                Column = false;
            }
        }

由于该行具有大量属性,因此将来手动设置每个属性将无法扩展。

【问题讨论】:

  • 尝试使用 for 循环
  • 返回列表中永远不会有“null”条目。您的查询要么找到匹配的行,要么没有。如果没有行与提供的过滤器匹配,您将返回一个空列表

标签: c# linq


【解决方案1】:

您只需要使用标准 for 循环而不是 foreach。您不能修改 foreach 中的集合,因为这就是迭代器的工作方式。但是,您可以修改对象本身的值。

另请参阅:Changing objects value in foreach loop?

【讨论】:

    【解决方案2】:

    我认为你有这种错误的方式。如果您在任何类型的循环中将该值设置为 false,则当您退出循环的该迭代时,上下文将丢失。

    相反,您可能想要做的是,在使用列表时,将空值视为 false。您可以为此使用空合并运算符 (??)

    foreach (var row in FindTheMatch)
    {
        DoSomethingInterestingWith(row.Column ?? false); // pass false if Column is null.
    }
    

    【讨论】:

    • 列怎么可能是空的?查询要么返回匹配的行,要么不返回。
    • @alwayslearning - 我认为这是一个人为的例子。我怀疑 OP 的真正含义是该行中的 column 为空,并且他们希望将该列中的任何空值设置为 false。同样的答案也适用。
    • @Jamiec:你是对的,它是一行中的 columns,而不是我想更改的行本身。我会尽快按照你解释的方式去做。
    • @ThomasFonn 是的,我是这么认为的。查看更新,它可能更符合您正在做的事情。
    【解决方案3】:
    for(int i=0;i<SetRemainingValuesToFalse.length;i++)
    {
        if (SetRemainingValuesToFalse[i] == null)
        {
            SetRemainingValuesToFalse[i] = false;
         }
    }
    

    【讨论】:

      【解决方案4】:

      你有点误解了 foreach 的工作原理

      foreach(var c in col)

      读作

      While col.asEnumerable.HasValues let c = col.asEnumerable.Current

      因此,您无法在不中断循环的情况下更改可枚举或其当前值,但是如果可枚举未附加到您正在更改的集合,那么您就没有问题

      ToList 例如将克隆集合,这意味着枚举附加到克隆而不是原始集合

      foreach(var c in col)
          col.Remove(c);
      

      会出错

      foreach(var c in col.ToList())
          col.Remove(c);
      

      工作正常

      明智的

      foreach(var c in col)
          if(c.Field == null) c.Field = false;
      

      也很好,因为您正在编辑当前可枚举位置的内容而不是位置本身

      但是您表示希望仅替换集合中的空值要简单得多

      col.Select(c=>c??false); //c#6
      col.Select(c=>c == null? false : c); //c#<6
      

      因为您似乎正在使用类似于数据表的东西,那么您可以这样做

      foreach(var row in table.Rows)
          foreach(var col in table.Columns)
              row[col] = row[col] ?? false;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-07-02
        • 2014-09-21
        • 2018-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多