【问题标题】:How to find specific Elements in Lists which are part of Lists如何在作为列表一部分的列表中查找特定元素
【发布时间】:2015-07-24 19:55:44
【问题描述】:

我的问题是::

我有一个“公司”类的实例列表 每个公司都包含一个“汽车”类的列表和一个唯一的 ID 每辆车都有很多具体的数据,比如“品牌”和“型号”

我的任务是创建一个新列表,其中包含所有重复的汽车以及使用它们的公司 ID。在每个“汽车”类中都有一个对象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 .....

【问题讨论】:

  • Iequalitycomparer 是你要找的。​​span>
  • 使用示例数据(可编译代码)创建List<company>,编写您期望的输出并附上您迄今为止尝试过的代码。现在这是一个很好的问题。
  • 如果我理解正确,您正在寻找品牌和型号出现在多个公司列表中的汽车?您想知道这辆车的品牌和型号以及包含该车的公司吗?

标签: c# linq list sorting extract


【解决方案1】:

我认为您想要的可以通过以下方式实现。

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))
             };

【讨论】:

  • 非常感谢您的解决方案。这正是我一直在寻找的。问题已经解决了
【解决方案2】:

我建议把你的任务分成几个步骤:

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

DotNetFiddle

【讨论】:

  • 问题被很好地解决了并且表达得很好
  • 非常感谢。我非常关注我的数据结构,以至于我没有考虑创建一个新的“主列表”,每个公司只有一个汽车级别。 :-D
猜你喜欢
  • 2020-02-25
  • 2017-10-03
  • 2020-03-29
  • 2016-12-17
  • 2011-10-20
  • 1970-01-01
  • 2020-07-07
  • 2021-07-16
  • 2022-07-23
相关资源
最近更新 更多