Можно ли получить индекс предмета, используя Contains? - PullRequest
0 голосов
/ 14 февраля 2019

Когда я использую if (moscowCars.Contains(cars[x].Name)), он находит значение в коллекции, и я считаю, что нет необходимости использовать moscowCars.RemoveAt(moscowCars.FindIndex(o => o.Equals(cars[x].Name)));, чтобы найти его во второй раз, просто: moscowCars.Remove(cars[x].Name);.Конечно, я могу использовать try & catch вместо if, но я просто хочу знать, могу ли я получить индекс предмета, используя Contains?

using System.Collections.Generic;

    namespace Autoworld
    {
        class GoodCars
        {
            static List<Tech> cars = new List<Tech>();
            public class Tech
            {
                public string Name { get; set; }
                public double KM { get; set; }
            }
            static void Main()
            {
                List<string> moscowCars = new List<string>
                {
                    "GAZ-330811 Aper", "Lada Vesta Sport"
                };
                cars.Add(new Tech() { Name = "Lada Vesta Sport", KM = 190 });
                for (int x = 0; x < cars.Count; x++)
                {
                    if (moscowCars.Contains(cars[x].Name))
                    {
                        moscowCars.RemoveAt(moscowCars.FindIndex(o => o.Equals(cars[x].Name)));
                    }
                }
            }
        }
    }

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы можете полностью удалить двухэтапный процесс и просто использовать .Remove, который вернет:

true, если элемент успешно удален;в противном случае false.Этот метод также возвращает false, если элемент не был найден в списке.

Это будет выглядеть следующим образом:

for (int x = 0; x < cars.Count; x++) 
{ 
    moscowCars.Remove(cars[x].Name); 
}

И если вам нужно обработать случай, когда нет автомобиляЕсли вы обнаружите, что он удален, вы можете заключить этот вызов в состояние if, например:

for (int x = 0; x < cars.Count; x++) 
{ 
    if (!moscowCars.Remove(cars[x].Name))
    {
        // Handle no cars to remove
    }
}

Стоит отметить, что за кадром .Remove в конечном итоге просто получает индекс, а затем удаляет элемент при этомindex (это то, что вы изначально пытались сделать в любом случае):

public bool Remove(T item) {
    int index = IndexOf(item);
    if (index >= 0) {
        RemoveAt(index);
        return true;
    }

    return false;
}

См. здесь для источника.


В качестве альтернативы, как заявили другие, если вы ожидаете, что список будет содержать больше, чем элемент, который вы хотите удалить, вы можете использовать .RemoveAll:

moscowCars.RemoveAll(y => y == cars[x].Name);

И снова, для обработки случая, когда ничего не найдено:

if (moscowCars.RemoveAll(y => y == cars[x].Name) == 0)
{
    // Handle no cars to remove
}
0 голосов
/ 14 февраля 2019

Используйте просто RemoveAt, если вы уверены, что у вас нет дублированных элементов, в любом случае используйте второй способ.

  1. Решение

    static List<Tech> cars = new List<Tech>();
    public class Tech
    {
        public string Name { get; set; }
        public double KM { get; set; }
    }
    
    static void Main()
    {
        List<string> moscowCars = new List<string>
            {
                "GAZ-330811 Aper", "Lada Vesta Sport"
            };
    
        cars.Add(new Tech() { Name = "Lada Vesta Sport", KM = 190 });
    
        for (int x = 0; x < cars.Count; x++)
        {
            if (moscowCars.Contains(cars[x].Name))
            {
                moscowCars.RemoveAt(moscowCars.IndexOf(cars[x].Name));
            }
        }
    }
    
  2. Решение

    static List<Tech> cars = new List<Tech>();
    public class Tech
    {
        public string Name { get; set; }
        public double KM { get; set; }
    }
    
    static void Main()
    {
        List<string> moscowCars = new List<string>
            {
                "GAZ-330811 Aper", "Lada Vesta Sport"
            };
    
        cars.Add(new Tech() { Name = "Lada Vesta Sport", KM = 190 });
    
        for (int x = 0; x < cars.Count; x++)
        {
            if (moscowCars.Contains(cars[x].Name))
            {
                moscowCars.RemoveAll(o => o == cars[x].Name);
            }
        }
    }
    

Надеюсь, это поможет.

0 голосов
/ 14 февраля 2019

Вы действительно можете использовать IndexOf (item), это даст вам индекс элемента, или -1, если 'item' не был найден (что делает этот метод также двойным, как и "includes")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...