替代在foreach C#中设置值

时间:2016-08-23 09:01:59

标签: c# linq

我对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;
            }
        }

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

4 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

for(int i=0;i<SetRemainingValuesToFalse.length;i++)
{
    if (SetRemainingValuesToFalse[i] == null)
    {
        SetRemainingValuesToFalse[i] = false;
     }
}

答案 3 :(得分:0)

你有点误解了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;