C#从对象列表中删除对象

时间:2013-09-20 13:13:01

标签: c#

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

最初我使用了foreach,但后来意识到你在修改集合时不能使用它,所以我决定使用普通的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);
            }
        }

    }

11 个答案:

答案 0 :(得分:60)

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

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

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

ChunkList.RemoveAll(x => x.UniqueId == ChunkID);

答案 1 :(得分:17)

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

for (int i = ChunkList.Count-1; i >=0; i--)
{
    if (ChunkList[i].UniqueID == ChunkID)
    {
        ChunkList.RemoveAt(i);
    }
}

答案 2 :(得分:7)

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

ChunkList.RemoveAll(chunk => chunk.UniqueID == ChunkID);

答案 3 :(得分:3)

  

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

您可以创建该集合的副本,并使用ToList()进行迭代以创建要复制:

 foreach(Chunk chunk in ChunkList.ToList())
 {
     if (chunk.UniqueID == ChunkID)
     {
         ChunkList.Remove(chunk);
     }
 }

答案 4 :(得分:2)

此代码存在两个问题:

  • Capacity表示在需要调整大小之前列表可以包含的项目数,而不是实际计数;您需要使用Count代替
  • 当您从列表中删除时,您应该倒退,否则当两个相同的项目彼此相邻时,您可以跳过第二个项目。

答案 5 :(得分:2)

您正在检查i的{​​{1}},而UniqueID实际上是一个整数。如果你想继续i循环,你应该做那样的事情。

for

然而,您可以并且应该使用linq:

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

答案 6 :(得分:1)

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

答案 7 :(得分: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++;
      }
   }
}

答案 8 :(得分:1)

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

       var item = myList.Find(x=>x.ItemName == obj.ItemName);
       myList.Remove(item);

答案 9 :(得分:0)

首先,您使用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);

答案 10 :(得分: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&lt; Chunk&gt;来实现这一点。)