Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我不知道';我不认为我';我正在修改这个集合_C#_List_Object_Collections - Fatal编程技术网

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);
    }
}