C# 如果列表中的所有重复项存在于另一个列表中,如何更新这些重复项?

C# 如果列表中的所有重复项存在于另一个列表中,如何更新这些重复项?,c#,list,C#,List,我试图更新对象列表中的所有重复项(如果它们存在于另一个集合中) 这是我的代码: public class Cars { public string brand { get; set; } public string model { get; set; } public string allowed { get; set; } } var notAllowedModels = GetNotAllowedModels(); // returns a List<Stri

我试图更新对象列表中的所有重复项(如果它们存在于另一个集合中)

这是我的代码:

public class Cars
{
    public string brand { get; set; }
    public string model { get; set; }
    public string allowed { get; set; }
}

var notAllowedModels = GetNotAllowedModels(); // returns a List<String> with model names

foreach(var car in cars) // cars is a List<Car>
{
    if (notAllowedModels.Contains(car.model))
       cars[cars.FindIndex(x => x.model == car.model)].allowed = "No";
    else
       cars[cars.FindIndex(x => x.model == car.model)].allowed = "Yes";
}
如果列表中的模型是唯一的,那么这很好,但是如果它们存在不止一次,那么只有第一个模型将被更新,而其他模型将为空

有人能想出一种方法来更新所有副本(如果它们存在于notAllowedModels列表中)吗

我知道我可以使用FindAll而不是FindIndex,但它会返回一个列表,我不确定它到底有什么帮助,因为复制品也会有同样的问题。

您不需要使用list.FindIndex来查找汽车,您已经有了它:

foreach(Car car in cars) // cars is a List<Car>
{
    if (notAllowedModels.Contains(car.model))
       car.allowed = "No";
    else
       car.allowed = "Yes";
}
顺便说一下,如果要提高性能,请从GetNotAllowedModels返回一个哈希集。它只包含唯一的值,并且在LookupContains中非常有效。

您还可以使用Linq扩展方法来查找车辆列表中也在notAllowedModels列表中的所有车辆

Union方法使用默认的比较器。所以你应该重载cars类的Equals方法

另一方面,对于可能为false或true的值,使用bool通常比使用字符串类型更好,并且使用属性比公开成员更好

public class Car
{
    public bool IsAllowed {get;set;}
    // rest of your class
}

您可以使用GroupBy按模型对汽车进行分组,然后检查该模型是否允许,如果不允许,则循环分组模型中的所有汽车并将allowed设置为false。反之亦然。像这样的代码:

public class Cars
{
    public string brand { get; set; }
    public string model { get; set; }
    public string allowed { get; set; }
}

var notAllowedModels = new HasSet<string>(GetNotAllowedModels()); // using hasset to improve the performance

foreach(var carGroup in cars.GroupBy(car => car.model)) // cars is a List<Car>
{
    if (notAllowedModels.Contains(carGroup.Key))
        foreach(var c in carGroup)
            c.allowed = "No";
    else
        foreach(var c in carGroup)
            c.allowed = "Yes";
}

注意:您应该在notAllowedModels中使用HasSet来提高代码的性能,因为字典是索引的,而列表不是索引的,并且您每次都是按车循环的notAllowedCars中的循环。

您可以进一步完善这一点,但按照下面的思路做一些事情行得通吗

 foreach (var notAllowedCar in cars.Where((car) => notAllowedModels.Contains(car.model)))
        {
            notAllowedCar.allowed = "False";
        }

这不起作用,因为notAllowedModels是一个列表,cars是一个列表。如果它能工作,它将不会更新允许的模型为是。啊,我错过了。我的错!您不需要口述记录,因为它存储配对,而是一个哈希集。在列表中搜索时,在哈希集中搜索处于打开状态。谢谢@RoyT。我把Dict改成HashSet
 foreach (var notAllowedCar in cars.Where((car) => notAllowedModels.Contains(car.model)))
        {
            notAllowedCar.allowed = "False";
        }