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

如何使用Linq按Dictionary键值对搜索含指定listid的联系人对象?

问题

需要搜索包含List<Dictionary<string, string>>类型属性的联系人对象,按Dictionary的键和值筛选,找出所有包含listid = "65512fe1e759b98f40b48829"的联系人。

联系人JSON数组示例:

[
  {
    "first_name": "David",
    "last_name": "Smith",
    "email": "david@gmail.com",
    "phone": "1234567890",
    "website": "google.com",
    "relations": [
      {
        "listid": "65512fe1e759b98f40b48829"
      },
      {
        "listid": "34212fe1e759b98f40b48829"
      }
    ]
  },
  {
    "first_name": "Chris",
    "last_name": "Oven",
    "email": "chris@gmail.com",
    "phone": "1234567890",
    "website": "google.com",
    "relations": [
      {
        "listid": "65512fe1e759b98f40b48829"
      },
      {
        "listid": "34212fe1e759b98f40b48829"
      }
    ]
  }
]

尝试的代码(存在逻辑问题):

var searchPair = new KeyValuePair<string, string>("listid", "65512fe1e759b98f40b48829");

contacts.Where(p=>p.relations.Where(dictionary => dictionary[searchPair.Key].ToString().Contains(searchPair.Value)).ToList();
解决方案

问题分析

你原代码有两个明显问题:

  • 内层Where后直接调用ToList(),返回的是列表类型,但外层Where需要的是布尔值判断,导致类型不匹配;
  • 使用Contains做包含匹配,但你实际需要的是精确匹配指定listid的值,这个逻辑不符合需求。

正确实现

用Any方法判断联系人的relations列表中是否存在符合条件的字典即可,Any会返回布尔值,刚好满足外层Where的筛选要求:

var searchKey = "listid";
var searchValue = "65512fe1e759b98f40b48829";

var filteredContacts = contacts.Where(p => 
    p.relations.Any(dict => 
        dict.ContainsKey(searchKey) && dict[searchKey] == searchValue
    )).ToList();

额外优化

  • 增加ContainsKey(searchKey)判断,避免字典中不存在该键时抛出KeyNotFoundException;
  • 拆分搜索键值为单独变量,代码可读性更强;
  • 如果需要模糊匹配(而非精确匹配),可以把==改回Contains,但务必保留ContainsKey判断:
// 模糊匹配示例
var filteredContacts = contacts.Where(p => 
    p.relations.Any(dict => 
        dict.ContainsKey(searchKey) && dict[searchKey].Contains(searchValue)
    )).ToList();

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:30:05