如何更新列表中的所有重复项<;对象>;如果它们存在于另一个列表中
本文关键字:列表 对象 另一个 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
方法。
顺便说一句,对于可以是false
或true
的值,使用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中循环的