我有以下类(注意为了简洁而删除了一些属性
/// <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;
}
}
}
}
答案 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/。如果您在那里发布代码,您可能会得到更深入的评论。