如何从List中获取Field1/Field2最长的行?LINQ代码问题求助
正确实现逻辑指导
原代码的主要问题
- 集合不能直接和数字比较(
checkedPrices == 0、checkedPrices == 1),应该用checkedPrices.Count == 0或countPrices == 1 - 未定义变量
countFixedPrices,需替换为countPrices - 逻辑错误:直接取全局的Field2最大长度,没有先筛选Field1最长的元素,结果不符合需求
- 错误使用
IndexOf和ElementAt:maxPrices2是长度值,不是元素或索引,无法用于这两个方法
正确实现方式
方式一:LINQ链式查询(简洁高效)
通过排序优先级直接获取目标元素:先按Field1长度降序,再按Field2长度降序,最后取第一个元素。列表为空则返回null。
// 获取目标元素,为空则返回null var targetPrice = checkedPrices .OrderByDescending(p => p.Field1.Length) .ThenByDescending(p => p.Field2.Length) .FirstOrDefault(); // 若需要将结果放回checkedPrices列表(保持原列表类型): checkedPrices = targetPrice != null ? new List<PriceType> { targetPrice } : null;
注:将PriceType替换为你的实际数据类型
方式二:分步筛选(更直观)
如果觉得链式查询不够清晰,可以分步处理:
- 找到Field1的最大长度
- 筛选出所有Field1长度等于最大值的元素
- 在这些元素中找到Field2的最大长度
- 筛选出Field2长度等于最大值的元素(取第一个即可)
if (!checkedPrices.Any()) { checkedPrices = null; } else { // 第一步:获取Field1的最大长度,筛选对应元素 int maxField1Length = checkedPrices.Max(p => p.Field1.Length); var candidates = checkedPrices.Where(p => p.Field1.Length == maxField1Length).ToList(); if (candidates.Count == 1) { checkedPrices = candidates; } else { // 第二步:在候选元素中获取Field2的最大长度,筛选对应元素 int maxField2Length = candidates.Max(p => p.Field2.Length); var target = candidates.First(p => p.Field2.Length == maxField2Length); checkedPrices = new List<PriceType> { target }; } }
关键说明
- 用
Any()判断集合是否为空比Count == 0更高效(对于IEnumerable,Count会遍历整个集合,Any()找到第一个元素就停止) - 若存在多个Field1和Field2长度都相同的元素,上述代码会取第一个出现的元素,符合常规需求
- 无需单独处理集合长度为1的情况,两种方式都会自动覆盖该场景
内容的提问来源于stack exchange,提问作者lakykytik
相关产品推荐
相关产品推荐

