С# Удалить объект из списка объектов
У меня есть список объектов, и я пытаюсь удалить конкретный объект в списке, сначала проверив свойство в объекте.
Первоначально я использовал 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);
}
}
}
Ответы
Ответ 1
Вы можете упростить это с помощью linq:
var item = ChunkList.SingleOrDefault(x => x.UniqueId == ChunkID);
if (item != null)
ChunkList.Remove(item);
Вы также можете сделать следующее, которое также будет работать, если есть более одного соответствия:
ChunkList.RemoveAll(x => x.UniqueId == ChunkID);
Ответ 2
Вы удаляете, а затем увеличиваете, что означает, что вы будете впереди себя. Вместо этого удалите в обратном порядке, чтобы вы не испортили свой следующий элемент.
for (int i = ChunkList.Count-1; i >=0; i--)
{
if (ChunkList[i].UniqueID == ChunkID)
{
ChunkList.RemoveAt(i);
}
}
Ответ 3
Если ChunkList
- List<Chunk>
, вы можете использовать метод RemoveAll
:
ChunkList.RemoveAll(chunk => chunk.UniqueID == ChunkID);
Ответ 4
Первоначально я использовал foreach, но потом понял, что вы не можете использовать это при изменении коллекции
Вы можете создать копию коллекции и перебрать ее с помощью ToList()
, чтобы создать для копирования:
foreach(Chunk chunk in ChunkList.ToList())
{
if (chunk.UniqueID == ChunkID)
{
ChunkList.Remove(chunk);
}
}
Ответ 5
С этим кодом возникают две проблемы:
-
Capacity
представляет количество элементов, которые может содержать список до изменения размера, а не фактическое количество; вам нужно использовать Count
, а
- Когда вы удаляете из списка, вы должны вернуться назад, иначе вы можете пропустить второй элемент, когда два одинаковых элемента находятся рядом друг с другом.
Ответ 6
Вы проверяете i
UniqueID
, а i
на самом деле является целым числом. Вы должны сделать что-то подобное, если хотите остаться с циклом for
.
for (int i = 0; i < ChunkList.Capacity; i++)
{
if (ChunkList[i].UniqueID == ChunkID)
{
ChunkList.Remove(i);
}
}
Вы можете и должны, однако, использовать linq:
ChunkList.Remove(x => x.UniqueID == ChunkID);
Ответ 7
Сначала вы должны найти объект в списке. Затем вы можете удалить из списка.
var item = myList.Find(x=>x.ItemName == obj.ItemName);
myList.Remove(item);
Ответ 8
Один из способов - создать копию коллекции, которую вы хотите изменить, изменить копию по мере необходимости, а затем заменить исходную коллекцию копией в конце.
Ответ 9
Вы можете использовать цикл 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++;
}
}
}
Ответ 10
Во-первых, вы используете Capacity
вместо Count
.
Во-вторых, если вам нужно только удалить один элемент, то вы можете с радостью использовать цикл. Вам просто нужно убедиться, что вы вырвались из цикла после удаления элемента, например:
int target = 4;
for (int i = 0; i < list.Count; ++i)
{
if (list[i].UniqueID == target)
{
list.RemoveAt(i);
break;
}
}
Если вы хотите удалить все элементы из списка, которые соответствуют идентификатору, это станет еще проще, потому что вы можете использовать List<T>.RemoveAll(Predicate<T> match)
int target = 4;
list.RemoveAll(element => element.UniqueID == target);
Ответ 11
Простейшее решение без использования 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> для достижения этого.)
Ответ 12
foreach(object in objectList)
{
if (object.id == id)
{
// Remove item in objectList
objectList.Remove(object);
}
}