C# 我不知道';我不认为我';我正在修改这个集合
代码:C# 我不知道';我不认为我';我正在修改这个集合,c#,list,object,collections,C#,List,Object,Collections,代码: List Contents=ObjectHandler.player.Contents.ToList()//是哈希表 列表ID=新列表()//保存项目ID以供以后计数 foreach(目录中的第一项) { Add(I.ID);//将ID添加到ID } 列出新内容=内容; foreach(目录中的第一项) { if(IDS.Contains(I.ID))//检查该ID是否已在内容中使用 { newContents.Remove(I);//删除它 } } 内容=新内容; 此代码段应准备一个
List Contents=ObjectHandler.player.Contents.ToList()//是哈希表
列表ID=新列表()//保存项目ID以供以后计数
foreach(目录中的第一项)
{
Add(I.ID);//将ID添加到ID
}
列出新内容=内容;
foreach(目录中的第一项)
{
if(IDS.Contains(I.ID))//检查该ID是否已在内容中使用
{
newContents.Remove(I);//删除它
}
}
内容=新内容;
此代码段应准备一个ID列表,以便以后计数,并从项目列表中删除重复项。然而,一旦内容中出现一个项目,我就会收到一个InvalidOperationException。我相当确定我没有修改foreach循环的内容,因此我感到困惑。谁能给我解释一下吗?谢谢
List<Item> Contents = ObjectHandler.player.Contents.ToList<Item>() //Was HashTable
List<int> IDS = new List<int>(); //Holds Item IDs for later counting
foreach (Item I in Contents)
{
IDS.Add(I.ID); // Add ID to IDS
}
List<Item> newContents = Contents;
foreach (Item I in Contents)
{
if (IDS.Contains(I.ID)) //Check if the ID has already been used in Contents
{
newContents.Remove(I); //Remove it
}
}
Contents = newContents;
现在有两个变量指向同一个集合
您可能希望通过写入新列表(内容)
来复制集合
现在有两个变量指向同一个集合
您可能希望通过编写新列表(内容)
var Contents=ObjectHandler.player.Contents.ToList()来复制集合;
var id=new HashSet();
var filtered=Contents.Where(i=>
{
bool result=!IDs.Contains(i.ID);
添加(i.ID);
返回结果;
}).ToList();
var Contents=ObjectHandler.player.Contents.ToList();
var id=new HashSet();
var filtered=Contents.Where(i=>
{
bool result=!IDs.Contains(i.ID);
添加(i.ID);
返回结果;
}).ToList();
尽管@SLaks指出了一种复制列表并避免两个对象指向同一位置的好方法,但首先不需要两个列表
如果使用传统的for循环(而不是foreach)并向后计数,则可以毫无怨言地从原始列表中删除项目
以下几点应该是可行的:
var Contents = ObjectHandler.player.Contents.ToList<Item>();
var IDs = new HashSet<int>();
var filtered = Contents.Where( i =>
{
bool result = !IDs.Contains(i.ID);
IDs.Add(i.ID);
return result;
}).ToList();
尽管@SLaks指出了复制列表并避免两个对象指向同一个位置的好方法,但首先不需要两个列表 如果使用传统的for循环(而不是foreach)并向后计数,则可以毫无怨言地从原始列表中删除项目 以下几点应该是可行的:
var Contents = ObjectHandler.player.Contents.ToList<Item>();
var IDs = new HashSet<int>();
var filtered = Contents.Where( i =>
{
bool result = !IDs.Contains(i.ID);
IDs.Add(i.ID);
return result;
}).ToList();
我明白了,这很有道理,谢谢。我明白了,这很有道理,谢谢。顺便说一句,这将删除所有项目,而不仅仅是重复项。顺便说一句,这将删除所有项目,而不仅仅是重复项。顺便问一句,有人能指出在回复中引用其他人的最佳方式吗?我没有看到任何像blockquote或类似的按钮可以这样做。顺便问一下,有人能指出在回复中引用其他人的最佳方式吗?我没有看到任何像blockquote或类似的按钮可以做到这一点。
for (int i = Contents.Count - 1; i >= 0; i--)
{
if (IDS.Contains(Contents[i].ID)) //Check if the ID has already been used in Contents
{
Contents.RemoveAt(i);
}
}