You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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替换为你的实际数据类型

方式二:分步筛选(更直观)

如果觉得链式查询不够清晰,可以分步处理:

  1. 找到Field1的最大长度
  2. 筛选出所有Field1长度等于最大值的元素
  3. 在这些元素中找到Field2的最大长度
  4. 筛选出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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 03:45:49