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

如何基于另一列表的顺序条件过滤对象列表?

问题描述

我正在解决基于另一列表的值过滤对象列表的问题:

List 1(电话对象列表):

[
  {"Number":"324234","PhoneType":"Cell"},
  {"Number":"645645","PhoneType":"Work"},
  {"Number":"3453453","PhoneType":"phone"},
  {"Number":"342","PhoneType":"fax"}
]

List 2(优先级类型列表):

["Work","Cell","phone","Fax"]

核心条件

  • 按List 2的顺序从List 1中查找匹配记录,找到第一个存在的类型就返回对应记录
  • 过滤时必须排除Fax(大小写不敏感)类型
  • List 2的内容和顺序不固定(可能仅包含部分类型,顺序随时变化)

示例逻辑

如果List 2首项是Work,List 1存在该类型记录则直接返回;若不存在则继续查找List 2的下一项Cell,以此类推,直到找到符合条件的记录或遍历结束。

此前尝试的问题代码

尝试1:

var results = List1.Where((item, index) => list2[index] == "work");

问题:错误地用List1的索引匹配List2元素,逻辑完全错误,应按List2顺序匹配PhoneType值。

尝试2:

var primaryPhone = list1?.FirstOrDefault(p => !p.PhoneType.Equals("Fax") && !p.MediaType.Equals("Fax"));

问题:仅返回List1中第一条非Fax的记录,完全未遵循List2的优先级顺序。


解决方案

方式1:Lambda表达式结合LINQ实现

核心逻辑是先过滤List2中的Fax类型,再按优先级顺序在List1中查找第一个匹配项:

// 过滤List2中的Fax类型,保留原顺序(大小写不敏感)
var filteredPriorityTypes = list2.Where(type => !string.Equals(type, "Fax", StringComparison.OrdinalIgnoreCase)).ToList();

// 按优先级顺序查找第一个匹配的记录
var primaryPhone = filteredPriorityTypes
    .Select(type => list1.FirstOrDefault(item => string.Equals(item.PhoneType, type, StringComparison.OrdinalIgnoreCase)))
    .FirstOrDefault(result => result != null);

方式2:foreach循环实现(更直观)

遍历优先级列表,找到第一个匹配项就终止循环:

PhoneItem primaryPhone = null;

foreach (var priorityType in list2)
{
    // 跳过Fax类型(大小写不敏感)
    if (string.Equals(priorityType, "Fax", StringComparison.OrdinalIgnoreCase))
        continue;

    // 在List1中查找当前优先级的记录
    var match = list1.FirstOrDefault(item => string.Equals(item.PhoneType, priorityType, StringComparison.OrdinalIgnoreCase));
    if (match != null)
    {
        primaryPhone = match;
        break; // 找到第一个匹配项后立即终止循环
    }
}

关键说明

  • 加入大小写不敏感匹配,避免因List1的fax和List2的Fax大小写不一致导致漏判
  • 先过滤List2中的Fax类型,确保不会查找该类型的记录
  • 严格遵循List2的优先级顺序,找到第一个存在的匹配项就返回,完全符合需求

内容的提问来源于stack exchange,提问作者Nishanth

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:32:18