如何通过字段名称而非索引从对象列表中获取完整对象
通过name_connection获取对应Connection对象的解决方案
在已将JSON反序列化为Test类型的m_listTest对象后,可通过以下几种方式根据name_connection字段值获取对应的Connection对象,无需依赖数组索引:
1. 单次查询:使用LINQ直接查找
适合仅需单次查询的场景,直接通过LINQ方法匹配:
// 获取匹配name_connection的对象(不存在则返回null) var targetConn = m_listTest.connections.FirstOrDefault(conn => conn.name_connection == "Connection_A"); // 若需确保对象存在(不存在时抛出异常),使用First方法 // var targetConn = m_listTest.connections.First(conn => conn.name_connection == "Connection_A");
2. 多次查询:转为Dictionary提升效率
如果需要多次根据name_connection查询,建议先将数组转为Dictionary,利用字典O(1)的查找效率优化性能:
// 一次性构建字典(键为name_connection,值为对应Connection对象) var connDict = m_listTest.connections.ToDictionary(conn => conn.name_connection); // 后续查询时通过TryGetValue避免键不存在的异常 if (connDict.TryGetValue("Connection_A", out var targetConn)) { // 找到目标对象,执行后续逻辑 } else { // 未找到对应名称的连接 }
3. 处理重复name_connection的场景
若JSON中存在name_connection重复的情况,使用ToLookup进行分组查询:
// 构建分组查询结构 var connLookup = m_listTest.connections.ToLookup(conn => conn.name_connection); // 获取所有匹配指定name_connection的对象 var matchedConns = connLookup["Connection_A"]; foreach (var conn in matchedConns) { // 处理每个匹配的Connection对象 }
4. 封装到Test类中简化调用
可以在Test类中添加属性或方法,将查询逻辑封装起来,方便项目中复用:
public class Test { public Connection[] connections { get; set; } // 懒加载字典,首次使用时构建 private Dictionary<string, Connection> _connDict; public Dictionary<string, Connection> ConnectionDict { get { _connDict ??= connections?.ToDictionary(c => c.name_connection) ?? new Dictionary<string, Connection>(); return _connDict; } } // 直接提供查询方法 public Connection GetConnectionByName(string connName) { return connections?.FirstOrDefault(c => c.name_connection == connName); } }
使用封装后的逻辑:
// 通过字典属性查询 var conn = m_listTest.ConnectionDict["Connection_A"]; // 通过方法查询 var conn = m_listTest.GetConnectionByName("Connection_A");
内容的提问来源于stack exchange,提问作者marcoqf73
相关产品推荐
相关产品推荐

