C#中List<BsonDocument>反序列化为List<自定义类>并忽略无效数据,还有其他方法吗?
替代实现方案
除了foreach+try-catch的方式,还有两种更简洁的实现思路:
1. 封装Try式反序列化方法+LINQ筛选
自己封装一个尝试反序列化的方法,通过返回值标记是否成功,再结合LINQ过滤有效结果,代码更紧凑:
public static YourCustomClass? TryDeserializeBson(BsonDocument doc) { try { return BsonSerializer.Deserialize<YourCustomClass>(doc); } catch (Exception ex) { // 可选:记录异常日志,方便排查无效数据问题 return null; } } // 调用示例 var validItems = bsonDocuments .Select(TryDeserializeBson) .Where(item => item != null) .ToList()!;
如果担心重复反序列化的性能问题,也可以用输出参数的版本只执行一次反序列化:
public static bool TryDeserializeBson(BsonDocument doc, out YourCustomClass? result) { result = null; try { result = BsonSerializer.Deserialize<YourCustomClass>(doc); return true; } catch (Exception ex) { // 日志记录 return false; } } // 调用示例 var validItems = new List<YourCustomClass>(); foreach (var doc in bsonDocuments) { if (TryDeserializeBson(doc, out var item) && item != null) { validItems.Add(item); } }
2. 利用MongoDB驱动原生的TryDeserialize重载
MongoDB的BsonSerializer原生提供了TryDeserialize重载,无需手动捕获异常,直接通过API返回值判断是否成功:
var validItems = new List<YourCustomClass>(); foreach (var doc in bsonDocuments) { using var reader = new BsonDocumentReader(doc); if (BsonSerializer.TryDeserialize(reader, out YourCustomClass? item) && item != null) { validItems.Add(item); } }
这种方式更贴合驱动的原生设计,避免了手动try-catch的开销,逻辑也更清晰。
内容的提问来源于stack exchange,提问作者Reg Ret
相关产品推荐
相关产品推荐

