Подтвердить что ты не робот

С# Удалить объект из списка объектов

У меня есть список объектов, и я пытаюсь удалить конкретный объект в списке, сначала проверив свойство в объекте.

Первоначально я использовал 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);
            }
        }

    }
4b9b3361

Ответ 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);
       }
    }