更好地处理两个类中的共同对象

时间:2017-06-28 19:55:50

标签: c# linq

我有以下类(注意为了简洁而删除了一些属性

    /// <summary>
    /// Customer Data class holds all high level customer Data
    /// </summary>
    public class CustomertData
    {
        public int CustomerId { get; set; }

        public IList<Car> AvailableCars { get; set; }

        public IList<CustomerUnit> CustomerUnits { get; set; }
    }

    /// <summary>
    /// Customer Unit holds all data relating to a customer unit
    /// </summary>
    public class CustomerUnit
    {
        public int? CutsomerUnitId { get; set; }

        public int? UnitIndex { get; set; }

        public string Description { get; set; }

        public IList<Car> CustomerUnitCars { get; set; }   
    }

可以看出,客户数据类包含CustomerUnits列表以及AvailableCars列表 - 然后CustomerUnit类包含已添加到该单元的汽车列表。

Car类有一个被赋值的属性,它是一个bool,然后是一个int CarId和一些其他与我正在做的事情无关的属性。我从WebAPI返回一个CustomerData对象。对于可用的汽车,我想展示它们。已分配给单位的任何内容都设置为true,而其余内容均为false。

我目前使用下面的代码执行此操作,它正在按预期工作,只是想知道是否有更好的方法或许使用linq - 我试图做一些谷歌搜索,它似乎使用交叉可能是使用的方法,但没有得到使用它所需的输出。

                

                var customerUnits = customerData.CustomerUnits;

                var carIds = new List<int>();

                if (customerUnits.Any())
                {
                    foreach (var customerUnit in customerUnits )
                    {
                        customerUnit.CustomerUnitCars.ToList().ForEach(c => c.Assigned = true);

                        foreach (var customerUnitCar in customerUnit.CustomerUnitCars)
                        {
                            carIds.Add(customerUnitCar.CarId);
                        }
                    }
                }

                if(carIds.Any())
                {
                    foreach (var carId in carIds)
                    {
                        foreach (var availableCar in customerData.AvailableCars)
                        {
                            if(availableCar.CarId == carId)
                            {
                                availableCar.Assigned = true;
                            }
                        }
                    }
                }

1 个答案:

答案 0 :(得分:0)

你可以肯定地简化(或称之为“相交”)一些逻辑,如果这是你正在寻找的东西:

if (customerUnits.Any())
{
    foreach (var customerUnit in customerUnits)
    {
        customerUnit.CustomerUnitCars.ToList().ForEach(c => c.Assigned = true);
        foreach (var customerUnitCar in customerUnit.CustomerUnitCars)
        {
            carIds.Add(customerUnitCar.CarId);
            customerData.AvailableCars
                .Where(availableCar => availableCar.CarId == customerUnitCar.CarId)
                .ToList()
                .ForEach(availableCar => availableCar.Assigned = true);
        }
    }
}

请记住,一旦你进入嵌套for循环和LINQ,你的代码将变得越来越不可读。我个人对您当前的实施没有任何问题。

另外,请查看https://codereview.stackexchange.com/。如果您在那里发布代码,您可能会得到更深入的评论。