[英]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);
}
}
如果ChunkList
是List<Chunk>
,則可以使用RemoveAll
方法:
ChunkList.RemoveAll(chunk => chunk.UniqueID == ChunkID);
最初我使用了foreach,但后來意識到修改集合時不能使用它
您可以創建集合的副本,並使用ToList()
遍歷該集合以創建要復制的副本:
foreach(Chunk chunk in ChunkList.ToList())
{
if (chunk.UniqueID == ChunkID)
{
ChunkList.Remove(chunk);
}
}
當i
實際上是整數時,您正在檢查i
的UniqueID
。 如果要保留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.