C# 按ID将项目从一个列表分配到另一个列表

C# 按ID将项目从一个列表分配到另一个列表,c#,list,C#,List,我需要一些帮助,以便能够从一个列表中获取值并将其分配给另一个列表。我已经创建了一个简化版的我目前正在做的事情 鉴于以下情况: namespace ConsoleApplication1 { class Car { public Car(string maker) { this.maker = maker; this.counter = 0; } public stri

我需要一些帮助,以便能够从一个列表中获取值并将其分配给另一个列表。我已经创建了一个简化版的我目前正在做的事情

鉴于以下情况:

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());
            }
        }
    }
}
我相信会有更好的办法。我查看了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);
            }
但我得到一个空异常错误


感谢您的任何意见/建议。

您需要的是逻辑。您需要为每个汽车制造商设置该列表中的车型数量。因此,对于每个汽车制造商,计数器将等于modelList中的所有汽车,其中制造商等于carList中的制造商。确保还有“usingsystem.Linq;”


丰田没有车型列表,所以使用这个:count=b==null-1:b.伯爵。或者这个:count=b==null?null:(int?)b.countLINQ查询是正确的方法吗?我做了你建议的改变,效果很好。我只是想知道是否有更好的/建议的方法来实现这一点?是的。对于LINQ,有时需要考虑空条件。在这种情况下,Linq是一种很好的方法。
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);
            }
        foreach(Car carObject in carList)
        {
            carObject.counter = modelList.Where(x => x.maker == carObject.maker).ToList().Count;
        }