簡體   English   中英

C#從對象列表中刪除對象

[英]C# Remove object from list of objects

我有一個對象列表,並且嘗試通過首先檢查對象中的屬性來嘗試刪除列表中的特定對象。

最初,我使用了foreach但后來意識到在修改集合時不能使用此功能,因此我決定將Normal 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);
            }
        }

    }

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

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

您還可以執行以下操作,如果有多個匹配項,則也可以使用:

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

您要先刪除再增加,這意味着您將領先一步。 相反,請反向取下,這樣您就不會弄亂下一個項目。

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

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

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

最初我使用了foreach,但后來意識到修改集合時不能使用它

您可以創建集合的副本,並使用ToList()遍歷該集合以創建要復制的副本:

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

此代碼有兩個問題:

  • Capacity表示需要調整大小之前列表可以包含的項目數,而不是實際數量。 您需要改用Count ,並且
  • 從列表中刪除時,應向后移動,否則當兩個相同的項目彼此相鄰時,可以跳過第二個項目。

i實際上是整數時,您正在檢查iUniqueID 如果要保留for循環,則應該執行類似的操作。

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

您可以並且應該使用linq:

ChunkList.Remove(x => x.UniqueID == ChunkID);

首先,您必須在列表中找到對象。 然后,您可以從列表中刪除。

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

一種技術是創建要修改的集合的副本,根據需要更改副本,然后最后用副本替換原始集合。

您可以使用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++;
      }
   }
}

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

不使用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>來實現。)

foreach(object in objectList)
    {
       if (object.id == id)
       {
         // Remove item in objectList
           objectList.Remove(object);
       }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM