是否可以使用Contains获取项目索引?

时间:2019-02-14 13:36:18

标签: c# collections

当我使用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 :(得分:2)

您可以完全删除两步过程,而只需使用.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最终只是在后台获取索引,然后删除该索引处的项目(无论如何,这都是您最初尝试执行的操作):

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

    return false;
}

有关来源,请参见here


或者,如其他人所述,如果您希望列表包含的内容比要删除的项目多,则可以使用.RemoveAll

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

同样,要处理什么都没找到的情况:

if (moscowCars.RemoveAll(y => y == cars[x].Name) == 0)
{
    // Handle no cars to remove
}

答案 1 :(得分:0)

您确实可以使用IndexOf(item) 这将为您提供项目的索引,如果未找到“ item”,则为-1(也使该方法成为“ contains”的两倍)

答案 2 :(得分:0)

如果您确定没有任何重复的项目,请使用第二种方法。

  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);
            }
        }
    }
    

我希望它会有所帮助。