2015-10-28 5 views
0

Мне нужна помощь в возможности получить значение из одного списка и присвоить его другому списку. Я создал упрощенную версию того, что я делаю в данный момент.Назначить элемент из одного списка другому по ID

Учитывая следующее:

namespace ConsoleApplication1 
{ 
    class Car 
    { 
     public Car(string maker) 
     { 
      this.maker = maker; 
      this.counter = 0; 
     } 

     public string maker { get; set; } 
     public int counter { get; set; } 
    } 

    class CarModel 
    { 
     public CarModel(string maker, string model) 
     { 
      this.maker = maker; 
      this.model = model; 
     } 

     public string maker { get; set; } 
     public string model { get; set; } 
    } 

     class Program 
    { 
     static void Main(string[] args) 
     { 
      List<Car> carList = new List<Car>(); 
      carList.Add(new Car("Honda")); 
      carList.Add(new Car("Toyota")); 
      carList.Add(new Car("Nissan")); 
      carList.Add(new Car("Ford")); 
      carList.Add(new Car("Dodge")); 

      List<CarModel> modelList = new List<CarModel>(); 
      modelList.Add(new CarModel("Honda", "Accord")); 
      modelList.Add(new CarModel("Honda", "Civic")); 
      modelList.Add(new CarModel("Honda", "Pilot")); 
      modelList.Add(new CarModel("Ford", "F150")); 
      modelList.Add(new CarModel("Ford", "F250")); 
      modelList.Add(new CarModel("Ford", "Edge")); 
      modelList.Add(new CarModel("Ford", "Fusion")); 
      modelList.Add(new CarModel("Nissan", "GT-R")); 
      modelList.Add(new CarModel("Nissan", "Versa")); 
      modelList.Add(new CarModel("Dodge", "Ram")); 

      var grouped = modelList.GroupBy(s => s.maker, (key, values) => new { Maker = key, Count = values.Count() }); 

      foreach (var i in grouped) 
      { 
       foreach (Car car in carList) 
       { 
        if (i.Maker == car.maker) 
        { 
         car.counter = i.Count; 
        } 
       } 
      } 

      foreach (Car car in carList) 
      { 
       Console.WriteLine(car.maker + " | " + car.counter.ToString()); 
      } 
     } 
    } 
} 

я получить значение Count из сгруппированных переменной и присвоения его объекту автомобиля с помощью равенства в области производителя.

Цикл ForEach, который я использую, очень хорошо выполняет назначение, но я знаю, что, когда количество элементов увеличивается для каждого списка, цикл займет больше времени.

В результате я получаю, как показано ниже (что я требую)

Honda | 3 
Toyota | 0 
Nissan | 2 
Ford | 4 
Dodge | 1 

Я считаю, что было бы лучше, чтобы сделать это. Я посмотрел на метод Intersect, но для этого мне все же потребовалось бы прокрутить список, чтобы назначить значения.

Я попытался сделать внешнее соединение в списке, как:

var combined = from a in carList 
          from b in grouped 
          .Where(bOuter => bOuter.Maker == a.maker) 
          .DefaultIfEmpty() 
          select new 
          { 
           maker = a.maker, 
           count = b.Count 
          }; 

      foreach (var i in combined) 
      { 
       Console.WriteLine(i.maker + " - " + i.count); 
      } 

Но я получаю сообщение об ошибке Null Exception.

Оцените любые входы/предложения.

+0

У Toyota нет списка моделей, поэтому используйте это: count = b == null? -1: b.Count. Или это: count = b == null? null: (int?) b.Count – jdweng

+0

Правильно ли это запрос LINQ? Я сделал изменения, которые вы предложили, и это сработало хорошо. Мне просто интересно, есть ли лучший/предложенный способ достижения этого? – Batuta

+0

Да. С Linq вам иногда приходится учитывать нулевые условия. Linq - хороший метод в этом случае. – jdweng

ответ

0

Что вам нужно, это логика. Вы хотите установить для каждого автопроизводителя количество моделей, которые находятся в этом списке. Поэтому для каждого автопроизводителя счетчик будет равен всем автомобилям от модели, где производитель равен изготовителю в автолисте. Удостоверьтесь, что у вас также есть «using System.Linq;» ,

 foreach(Car carObject in carList) 
     { 
      carObject.counter = modelList.Where(x => x.maker == carObject.maker).ToList().Count; 
     }