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

如何用ID和ID_SCH匹配双Records列表并实现关联字段查询?

需求说明

现有两个Records类型的列表firstList与secondList,原本仅通过ID实现两列表匹配,现在需要改为同时使用ID和ID_SCH完成以下操作:

  • 遍历firstList,通过ID和ID_SCH判断项是否存在于secondList中;
  • 若存在,获取该对应项的BSID和BSID_SCH字段值;
  • 用获取到的BSID和BSID_SCH值,检查其是否存在于firstList中;
  • 若存在,获取firstList中对应项的ID和ID_SCH值。

现有代码片段

string getRecords = "SELECT .....";
List<Records> firstList = ReadAll(getRecords, reader => {
  return new Records(
    reader.ReadByName(NameRecord.ID, string.Empty),
    reader.ReadByName(NameRecord.ID_SCH, string.Empty)
  );
});

string getAllRecords = "SELECT .....";

List<Records> secondList = ReadAll(getAllRecords, reader => {
  return new Records(
    reader.ReadByName(NameRecord.ID, string.Empty),
    reader.ReadByName(NameRecord.ID_SCH, string.Empty),
    reader.ReadByName(NameRecord.BSID, string.Empty),
    reader.ReadByName(NameRecord.BSID_SCH, string.Empty),
  );
});

// 目前仅能通过ID匹配,希望改为同时用ID和ID_SCH,然后获取BSID和BSID_SCH的值
var aa= data.Select(l1 => l1.Id).Intersect(secondList.Select(l2 => l2.Id)).ToList();

解决方案

要实现双字段(ID+ID_SCH)匹配,核心是基于两个字段的组合做关联判断,以下是具体实现:

方式1:使用元组实现匹配(无需修改Records类)

元组默认支持值相等比较,适合快速实现双字段匹配逻辑:

// 1. 从firstList中找出在secondList中存在的项,提取对应的BSID和BSID_SCH
var matchedBsRecords = firstList
    .Join(secondList,
          first => (first.ID, first.ID_SCH),
          second => (second.ID, second.ID_SCH),
          (_, second) => new { second.BSID, second.BSID_SCH })
    .ToList();

// 2. 用BSID+BSID_SCH在firstList中匹配,获取对应的ID和ID_SCH
var finalResult = matchedBsRecords
    .Join(firstList,
          bs => (bs.BSID, bs.BSID_SCH),
          first => (first.ID, first.ID_SCH),
          (_, first) => new { first.ID, first.ID_SCH })
    .Distinct() // 避免重复结果
    .ToList();

方式2:重写Records的相等判断方法(长期维护更友好)

如果需要多次基于ID+ID_SCH做匹配,可以在Records类中重写相等判断逻辑,让系统默认识别双字段匹配规则:

public class Records
{
    // 原有字段定义
    public string ID { get; set; }
    public string ID_SCH { get; set; }
    public string BSID { get; set; }
    public string BSID_SCH { get; set; }

    // 重写Equals方法
    public override bool Equals(object obj)
    {
        if (obj is Records other)
        {
            return ID == other.ID && ID_SCH == other.ID_SCH;
        }
        return false;
    }

    // 重写GetHashCode方法,保证相等对象的哈希值一致
    public override int GetHashCode()
    {
        return HashCode.Combine(ID, ID_SCH);
    }
}

之后可以用更简洁的方式实现逻辑:

// 找出firstList和secondList的交集(基于ID+ID_SCH)
var commonRecords = firstList.Intersect(secondList).ToList();

// 提取BSID和BSID_SCH,再在firstList中匹配
var finalResult = commonRecords
    .Select(r => new { r.BSID, r.BSID_SCH })
    .Join(firstList,
          bs => (bs.BSID, bs.BSID_SCH),
          first => (first.ID, first.ID_SCH),
          (_, first) => new { first.ID, first.ID_SCH })
    .Distinct()
    .ToList();

逻辑说明

  • 第一次关联:通过ID+ID_SCH的组合键,筛选出同时存在于两个列表的项,提取所需的BSID和BSID_SCH;
  • 第二次关联:用BSID+BSID_SCH作为新的组合键,再次在firstList中匹配,获取最终需要的ID和ID_SCH;
  • Distinct():用于过滤可能出现的重复匹配结果,根据实际业务场景选择是否保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 05:35:41