我对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;
}
}
由于该行具有大量属性,因此将来手动设置每个属性将无法进行扩展。
答案 0 :(得分:2)
您只需要使用标准for循环而不是foreach
。您无法在foreach
内修改集合,因为这是迭代器的工作方式。但是,您可以修改对象本身的值。
答案 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;