如何解决尝试更改集合中的元素
我正在尝试修改此代码。我需要检查 FilteredCheckObservable
的特定元素中的值,如果为真,则更改该元素另一部分的值。
基本上类似
if (FilteredCheckObservable items.Lang = 'ENG')
{items.check = newcheckname;}
然后这将更新 sourceGroups 集合。
if (string.IsNullOrEmpty(departmentLine.LineID) || string.IsNullOrEmpty(departmentLine.LineName))
continue;
bool discovered = false;
foreach (var group in sourceGroups)
{
if (!group.Key.Line.IsEqual(departmentLine))
continue;
group.Key.Isdiscovered = true;
discovered = true;
group.Key.ScheduleStatusCount = group.CountGroupItem;
break;
}
if (discovered == false)
{
var _ScheduleItemObservable = new ScheduleItemObservable(departmentLine,MainViewviewmodel,Shift.ToString());
var item = new Grouping<ScheduleItemObservable,FilteredCheckObservable>(_ScheduleItemObservable);
if (IsShiftValid)
{
item.Key.Shift = Shift.ToString();
item.Key.IsHistoryEnabled = true;
}
sourceGroups.Add(item);
}
for (int index = 0; index < sourceGroups.Count; index++)
{
if (sourceGroups[index].Key.Isdiscovered == true)
{
foreach (var group in sourceGroups)
{
foreach (FilteredCheckObservable items in group)
{
if (items.Lang_ID == LanguageService.Instance.LanguageType.ToString())
{
sourceGroups.Clear();
sourceGroups.Add(item);
}
}
}
}
}
解决方法
欢迎特拉维斯,
我敢打赌罪魁祸首是你的 foreach 循环。 https://stackoverflow.com/a/759985/3403999
不允许在 foreach 循环内修改集合。 我不知道您的集合是否有索引器,但如果有,您可以转换为 for 循环:
for (int i = 0; i < sourceGroups.Count; i++)
{
var group = sourceGroups[i];
// The rest of your code.
我可能是错的。您确实说您正在尝试修改一些现有代码。是一些在线的代码吗?也许您可以链接到它以提供完整的上下文。
根据您的新代码段,您需要两个 for 循环:
for (int index = 0; index < sourceGroups.Count; index++)
{
if (sourceGroups[index].Key.IsDiscovered == true)
{
//foreach (var group in sourceGroups)
for (int j = 0; j < sourceGroups.Count; j++)
{
var group = sourceGroups[j];
foreach (FilteredCheckObservable items in group)
{
if (items.Lang_ID == LanguageService.Instance.LanguageType.ToString())
{
sourceGroups.Clear();
sourceGroups.Add(item);
}
}
}
}
}
^ 虽然这可能仍然是一个糟糕的循环。主要是因为您有 sourceGroups.Clear();
。
您最好做的是创建一个名为 say 'results' 的内部集合。循环查找您的条件,如果满足,则将该项目添加到结果集合中。
一旦您的循环终止,然后调用 sourceGroups.Clear(),然后调用 sourceGroups.AddRange(results)。如果 sourceGroups 没有 AddRange,那么最后一个循环:
foreach (var group in results) { sourceGroups.Add(group); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。