在集合的一部分

时间:2015-07-22 10:46:53

标签: c# interface devexpress controls ienumerable

在迭代控件列表时,如果控件使用接口ISaveTab,则会使用方法SaveData();

但是,对于此Ienumerable中的某个项目,它将始终从IEnumerable List xtcPersonnelTabs.TabPages中消失

我发现每当修改列表中的其他项目时,此项目将始终消失。例如,如果我的列表中有两个项目,则在运行((ISaveTab)p.Cotrols[0]).SaveData();的第一行时,Ienumerable列表实际上将丢失第二个条目,因此应用程序将因错误而崩溃

“集合已被修改;枚举操作可能无法执行。”

foreach (XtraTabPage p in xtcPersonnelTabs.TabPages)
{
    if (p.Controls[0] is ISaveTab)
    {
        myNote = (((ISaveTab)p.Controls[0]).NeedsSave());
        myNote.FormNoteTab = ((ISaveTab)p.Controls[0]);

        if (myNote.FormNeedsSave == 1)
        {
            if (myNote.FormHasMandy)
            {
                myNoteGroup.FormNeedsSave = 1;
                myNoteGroup.FormNoteGroup.Add(myNote);
            }
            else
            {
                ((ISaveTab)p.Controls[0]).SaveData();
                hasSaved = true;
            }
        }
    }
}

调试问题的原因导致我出现问题,因为.SaveData();方法在另一个表单上运行,因此我无法看到项目从我的Ienumerable中退出的时间点,即父表上的那一点。

1 个答案:

答案 0 :(得分:0)

我认为这可能是由以下原因引起的: 通过多次迭代或访问IEnumerable中的元素,您实际上正在调用该方法多次枚举IEnumberable。

假设.SaveData();从集合中删除了元素,那么当您再次访问IEnumerable时,枚举将再次枚举,但这次在SaveData中删除的元素将不再存在。

e.g。

var enumerable = GetData();
enumerable[0].SaveData();

GetData();的第二次调用中,将不会返回已保存的元素,因此第二次访问可枚举时将不会有第二个元素。

如果您首先使用以下命令将枚举强制转换为列表或数组:

var asList = enumerable.ToList();
var asArray = enumerable.ToArray();

然后迭代/修改列表或数组上的元素,你不应该发现元素丢失。

有关IEnumerable的多枚举的更多信息,请参阅: https://confluence.jetbrains.com/display/ReSharper/Possible+multiple+enumeration+of+IEnumerable