如何在列表中找到列表中的特定元素

时间:2015-07-24 19:55:45

标签: c# linq list sorting extract

我的问题是::

我有一个班级实例列表"公司" 每家公司都包含一个班级列表" 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 .....

2 个答案:

答案 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)

我建议将您的任务分解为步骤:

  1. 将汽车类型(品牌和型号)与公司配对,并编制这些的主列表。
  2. 由Car而不是公司
  3. 对这些对进行分组
  4. 仅选择包含多家公司的群组(如果原始数据中包含重复的条目,则可能需要检查不同的公司)
  5. 您现在拥有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
    }
    
  6. DotNetFiddle