Мне нужна помощь в возможности получить значение из одного списка и присвоить его другому списку. Я создал упрощенную версию того, что я делаю в данный момент.Назначить элемент из одного списка другому по 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.
Оцените любые входы/предложения.
У Toyota нет списка моделей, поэтому используйте это: count = b == null? -1: b.Count. Или это: count = b == null? null: (int?) b.Count – jdweng
Правильно ли это запрос LINQ? Я сделал изменения, которые вы предложили, и это сработало хорошо. Мне просто интересно, есть ли лучший/предложенный способ достижения этого? – Batuta
Да. С Linq вам иногда приходится учитывать нулевые условия. Linq - хороший метод в этом случае. – jdweng