如何获取C# List中符合年龄条件的Passenger元素索引位置?
问题描述
我希望打印出passengers_list列表中符合年龄范围条件的Passenger类元素在列表中的位置。最初编写的代码仅能输出符合条件的乘客信息:
int findAge1 = int.Parse(Console.ReadLine()); int findAge2 = int.Parse(Console.ReadLine()); foreach (Passenger passenger in passengers_list) { if (passenger.Age <= findAge1 && passenger.Age >= findAge2) { Console.WriteLine("Passagerare " + passenger + " är " + passenger.Age + "år gammal"); } }
我尝试通过添加计数器变量findPassenger实现了需求,但不确定这种方法是否规范,代码如下:
int findAge1 = int.Parse(Console.ReadLine()); int findAge2 = int.Parse(Console.ReadLine()); int findPassenger = 0; foreach (Passenger passenger in passengers_list) { findPassenger ++; if (passenger.Age <= findAge1 && passenger.Age >= findAge2) { Console.WriteLine("Passagerare " + findPassenger + " är " + passenger.Age + "år gammal"); } }
想请教是否存在更合适的实现方式?
可行的优化实现方式
你的计数器方法本身是有效的,但有几种更贴合C#开发习惯的写法:
1. 使用for循环直接操作索引
这种方式无需额外维护计数器,直接通过列表索引遍历,逻辑更直观:
// 修正变量名,让语义更清晰,避免边界混淆 int minAge = int.Parse(Console.ReadLine()); int maxAge = int.Parse(Console.ReadLine()); for (int i = 0; i < passengers_list.Count; i++) { Passenger passenger = passengers_list[i]; // 保持和原代码一致的年龄范围判断逻辑 if (passenger.Age >= minAge && passenger.Age <= maxAge) { // 若需要展示从1开始的位置用i+1,要原始索引(从0开始)直接用i Console.WriteLine($"Passagerare {i+1} är {passenger.Age}år gammal"); } }
优点:无需额外变量,避免计数器漏增、错增的潜在问题,代码逻辑直接易懂。
2. 使用LINQ查询(C# 3.0及以上版本支持)
如果项目允许使用LINQ,可以写出更简洁、可读性更强的代码,同时一次性完成索引关联和条件筛选:
int minAge = int.Parse(Console.ReadLine()); int maxAge = int.Parse(Console.ReadLine()); // 用Select关联元素和索引,再用Where筛选符合年龄条件的项 var matchedPassengers = passengers_list .Select((passenger, index) => new { Passenger = passenger, Position = index + 1 }) .Where(item => item.Passenger.Age >= minAge && item.Passenger.Age <= maxAge); foreach (var item in matchedPassengers) { Console.WriteLine($"Passagerare {item.Position} är {item.Passenger.Age}år gammal"); }
优点:逻辑高度聚合,把“获取位置+筛选条件”的逻辑放在一起,代码简洁易读,适合复杂筛选场景。
补充说明
你原来的计数器写法完全符合规范,只是相比上面两种方式,少了些C#原生语法的简洁感。如果是简单遍历场景,计数器方法完全可以用;如果追求代码的可读性和可维护性,优先考虑for循环或LINQ方案。
另外,强烈建议把findAge1、findAge2这类模糊的变量名改成minAge、maxAge,让代码语义更清晰,避免后续维护时混淆年龄范围的边界。
内容的提问来源于stack exchange,提问作者babula40
相关产品推荐
相关产品推荐

