2015-07-24 4 views
0

Моей проблемы ::Как найти конкретные элементы в списках, которые являются частью списков

У меня есть список экземпляров класса «компания» каждая компания содержит список класса «Автомобиль» и уникальный идентификатор В каждом автомобиле есть множество конкретных данных, таких как «бренд» «модель»

Моя задача - создать новый список, содержащий все дубликаты автомобилей с идентификатором компании, который их использует. В каждом классе «автомобиль» есть объект 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

IEqualityComparer является то, что ур ищет. –

+0

Создайте «Список » с образцовыми данными (компилируемый код), напишите ожидаемый результат и присоедините код, который вы пробовали до сих пор. Теперь это может быть хорошим вопросом. – EZI

+0

Если я правильно понимаю это, вы ищете автомобили, чья модель и модель появляются в нескольких списках компаний? И вы хотели бы знать машину и модель автомобиля и компании, которые включают этот автомобиль? – ryanyuyu

ответ

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

Большое вам спасибо за ваше решение. Это именно то, что я искал. Проблема решена – Michael

1

Я предлагаю разбивая свою задачу на этапы:

  1. PAIR тип автомобиля (марка и модель) с компанией и составить общий список из этих.
  2. Group эти пары на машине, а не компании
  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

+0

Проблема хорошо сломана и хорошо сочленена –

+0

Большое спасибо. Я был настолько привязан к моей структуре данных, что не думал о создании нового «главного списка» только с одним классом автомобилей для каждой компании. :-D – Michael