C#中foreach遍历乘客列表时跳过指定类型组合的问题
解决方案
方式一:先过滤需跳过的对象
在查找匹配乘客前,通过Where先排除「空位是成人(TypeId=1)且当前待匹配乘客是儿童(Type=2)」的组合,再执行原匹配逻辑:
foreach (var filePassenger in objFilePassengers) { // TypeId == 1 是成人,TypeId == 2 是儿童 var passenger = objPassengers // 跳过不符合要求的匹配组合 .Where(p => !(p.TypeId == "1" && filePassenger.Type == "2")) // 沿用原有匹配规则 .FirstOrDefault(p => (p.TypeId == filePassenger.Type && p.TypeId == "1") || (p.TypeId != "1" && filePassenger.Type != "1" && p.Age == filePassenger.Age)); if (passenger != null) { passenger.PassengerId = filePassenger.PassengerID; passenger.TypeId = filePassenger.Type; passenger.FirstName = filePassenger.Name.ToTitleCase(); passenger.LastName = filePassenger.LastName.ToTitleCase(); passenger.Age = filePassenger.Age; } }
方式二:针对儿童乘客单独处理
如果需求仅针对儿童乘客的匹配逻辑优化,可直接在处理儿童乘客时,限定只查找儿童空位(TypeId=2),自然跳过成人空位:
foreach (var filePassenger in objFilePassengers) { // TypeId == 1 是成人,TypeId == 2 是儿童 var passenger = filePassenger.Type == "2" // 儿童乘客仅匹配儿童空位,按年龄匹配 ? objPassengers.FirstOrDefault(p => p.TypeId == "2" && p.Age == filePassenger.Age) // 非儿童乘客沿用原有匹配逻辑 : objPassengers.FirstOrDefault(p => (p.TypeId == filePassenger.Type && p.TypeId == "1") || (p.TypeId != "1" && filePassenger.Type != "1" && p.Age == filePassenger.Age)); if (passenger != null) { passenger.PassengerId = filePassenger.PassengerID; passenger.TypeId = filePassenger.Type; passenger.FirstName = filePassenger.Name.ToTitleCase(); passenger.LastName = filePassenger.LastName.ToTitleCase(); passenger.Age = filePassenger.Age; } }
内容的提问来源于stack exchange,提问作者gonzaloev
相关产品推荐
相关产品推荐

