如何使用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
相关产品推荐
相关产品推荐

