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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:47:09