如何更新列表中的所有重复项<;对象>;如果它们存在于另一个列表中

本文关键字:列表 对象 另一个 lt gt 如果 存在 更新 何更新 | 更新日期: 2023-09-27 18:26:34

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

这是我的代码:

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返回HashSet<string>。它只包含唯一的值,并且在查找中非常高效(Contains)。

您也可以使用Linq-Union扩展方法来查找cars列表中的所有汽车,这些汽车也在notAllowedModels列表中。

var union = cars.Union(notAllowedModels);
union.ForEach(x => x.allowed = "No");

Union方法使用默认比较器。因此,您应该重载cars类的Equals方法。

顺便说一句,对于可以是falsetrue的值,使用bool类型通常比使用string类型更好,并且使用属性比公开成员更好。

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

您可以进一步完善这一点,但以下内容是否有效?

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

您可以使用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,以提高代码的性能,因为Dictionary是索引的,而List不是,而且你每次在循环中都是在notAllowed Cars中循环的