35

我有一个对象列表,我试图通过首先检查对象中的属性来删除列表中的特定对象。

最初我使用 aforeach但后来意识到在修改集合时不能使用它,所以我决定使用普通的for,但后来我不确定如何编写代码来完成我最初编写的代码。

我如何着手编写代码来完成我最初的工作?

谢谢

这是我的代码:

    public void DeleteChunk(int ChunkID)
    {
        //foreach (Chunk i in ChunkList)
        //{
        //    if (i.UniqueID == ChunkID)
        //    {
        //        ChunkList.Remove(i);
        //    }
        //}

        //This won't work because here i is just an integer so i.UniqueID won't exist.
        for (int i = 0; i < ChunkList.Capacity; i++)
        {
            if (i.UniqueID == ChunkID)
            {
                ChunkList.Remove(i);
            }
        }

    }
4

11 回答 11

89

您可以使用 linq 简化此操作:

var item = ChunkList.SingleOrDefault(x => x.UniqueId == ChunkID);
if (item != null)
    ChunkList.Remove(item);

您还可以执行以下操作,如果有多个匹配项,这也将起作用:

ChunkList.RemoveAll(x => x.UniqueId == ChunkID);
于 2013-09-20T13:14:23.110 回答
18

您正在删除然后增加,这意味着您将领先于自己。相反,请反向删除,这样您就不会弄乱您的下一个项目。

for (int i = ChunkList.Count-1; i >=0; i--)
{
    if (ChunkList[i].UniqueID == ChunkID)
    {
        ChunkList.RemoveAt(i);
    }
}
于 2013-09-20T13:15:17.253 回答
8

如果ChunkListList<Chunk>,您可以使用以下RemoveAll方法:

ChunkList.RemoveAll(chunk => chunk.UniqueID == ChunkID);
于 2013-09-20T13:16:20.220 回答
5

首先,您必须找出列表中的对象。然后您可以从列表中删除。

       var item = myList.Find(x=>x.ItemName == obj.ItemName);
       myList.Remove(item);
于 2018-12-28T10:25:03.727 回答
4

最初我使用了一个 foreach 但后来意识到你不能在修改集合时使用它

ToList()您可以创建集合的副本并使用创建来迭代它来复制:

 foreach(Chunk chunk in ChunkList.ToList())
 {
     if (chunk.UniqueID == ChunkID)
     {
         ChunkList.Remove(chunk);
     }
 }
于 2013-09-20T13:17:47.307 回答
2

这段代码有两个问题:

  • Capacity表示在需要调整大小之前列表可以包含的项目数,而不是实际计数;您需要改为使用Count,并且
  • 当你从列表中删除时,你应该倒退,否则当两个相同的项目彼此相邻时,你可以跳过第二个项目。
于 2013-09-20T13:15:53.020 回答
2

您正在检查i's UniqueIDwhilei实际上是一个整数。如果你想保持for循环,你应该做这样的事情。

for (int i = 0; i < ChunkList.Capacity; i++)
{
    if (ChunkList[i].UniqueID == ChunkID)
    {
        ChunkList.Remove(i);
    }
}

但是,您可以并且应该使用 linq:

ChunkList.Remove(x => x.UniqueID == ChunkID);
于 2013-09-20T13:17:31.110 回答
1

首先,您使用Capacity的是Count.

其次,如果您需要删除一项,那么您可以愉快地使用循环。您只需要确保在删除项目后跳出循环,如下所示:

int target = 4;

for (int i = 0; i < list.Count; ++i)
{
    if (list[i].UniqueID == target)
    {
        list.RemoveAt(i);
        break;
    }
}

如果您想从列表中删除与 ID 匹配的所有项目,它会变得更加容易,因为您可以使用List<T>.RemoveAll(Predicate<T> match)

int target = 4;

list.RemoveAll(element => element.UniqueID == target);
于 2013-09-20T13:33:50.697 回答
1

您可以使用 while 循环删除匹配 ChunkID 的项目。这是我的建议:

public void DeleteChunk(int ChunkID)
{
   int i = 0;
   while (i < ChunkList.Count) 
   {
      Chunk currentChunk = ChunkList[i];
      if (currentChunk.UniqueID == ChunkID) {
         ChunkList.RemoveAt(i);
      }
      else {
        i++;
      }
   }
}
于 2013-09-20T14:20:34.537 回答
1

一种技术是创建要修改的集合的副本,根据需要更改副本,然后用最后的副本替换原始集合。

于 2013-09-20T13:15:40.127 回答
0

不使用 LINQ 的最简单解决方案:

    Chunk toRemove = null;
    foreach (Chunk i in ChunkList)
    {
        if (i.UniqueID == ChunkID)
        {
            toRemove = i;
            break;
        }
    }
    if (toRemove != null) {
        ChunkList.Remove(toRemove);
    }

(如果 Chunk 是一个结构,那么您可以使用 Nullable<Chunk> 来实现这一点。)

于 2016-01-20T03:11:49.810 回答