我的问题是::
我有一个班级实例列表"公司" 每家公司都包含一个班级列表" Car"和一个独特的身份 每辆车都有很多特定的数据,如"品牌" "模型"
我的任务是创建一个新列表,其中包含所有使用它们的公司ID的重复汽车。在每辆"汽车" class是一个对象licensplateNO
,它也是唯一的。因此,仅检查Cars的重复实例是没有选项的,因为每个实例在licenseplate属性中是不同的。我的最后一个想法是用老式的方式做,用很多循环比较每个元素的每个属性。
结果应如下所示:
list duplicateCars:
Car1: BMW M4 used by Company B, Company F, Company X
Car2: Audi A3 used by Company B, Company D
Car3: VW Golf used by Company D, Company F .....
答案 0 :(得分:3)
我认为您可以通过以下方式实现您的目标。
var result = companies.SelectMany(
company => company.Cars.Select(car => new {Car = car, Company = company}))
.GroupBy(cc => new { cc.Car.Make, cc.Car.Model })
.Where(grp => grp.Count() > 1)
.Select(grp => new
{
grp.Key.Make,
grp.Key.Model,
Companies = string.Join(", ", grp.Select(cc => cc.Company.CompanyName))
});
首先选择所有公司及其汽车,然后根据汽车的品牌和型号进行分组,然后仅使用一种类型的汽车过滤掉组,最后选择每种独特类型汽车的品牌和型号并创建一个逗号分隔的string
公司名称。您可能需要更改代码以使用类属性的特定名称,或者更改要分组的汽车的确切属性。
或者您也可以使用查询语法
var result = from company in compaines
from car in company.Cars
group new { Company = company, Car = car } by new { car.Make, car.Model }
into grp
where grp.Count() > 1
select new
{
grp.Key.Make,
grp.Key.Model,
Companies = string.Join(", ", grp.Select(cc => cc.Company.CompanyName))
};
答案 1 :(得分:1)
我建议将您的任务分解为步骤:
您现在拥有Car-List<Company>
分组的集合。打印或其他
var carDealerPairs = dealers.SelectMany( d => d.Cars.Select(car => new {Car = car, Dealer = d}));
var groupsOfCars = carDealerPairs.GroupBy(pair => new {Make = pair.Car.Make, Model = pair.Car.Model});
var groupsWithDuplicates = groupsOfCars.Where(grp => grp.Count() > 1);
foreach (var grp in groupsWithDuplicates)
{
var car = grp.Key;
var companies = grp.Select(c => c.Dealer);
//do whatever
}