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

如何用Fluent Assertions验证含字符串型数值属性的对象列表排序顺序?

用Fluent Assertions验证字符串类型数值的排序顺序

Fluent Assertions自带验证列表排序的方法:

list.Should().BeInDescendingOrder(x => x.stringProperty);
list.Should().BeInAscendingOrder(x => x.stringProperty);

但如果列表中对象的排序依据是存储为字符串的数值,直接用上述方法会因为字符串的字典序比较逻辑导致断言失败。比如下面的列表:

var list = new List<MyObject>
{
    new MyObject { stringProperty = "20" },
    new MyObject { stringProperty = "100" },
    new MyObject { stringProperty = "300" }
    // 更多对象...
};

字符串比较中"100"会被认为小于"20",但实际数值上100大于20,直接断言升序会触发测试失败。

之前有人尝试把属性转换为数值存入新列表:

var numericList = list.Select(x => double.Parse(x.stringProperty)).ToList();

但这种方式无法验证原对象列表的排序正确性,我们需要直接在原列表上完成转换后的排序验证。


解决方案

方法1:在排序断言的选择器中直接转换数值

可以直接在BeInAscendingOrder或BeInDescendingOrder的属性选择器里,把字符串转换为数值类型,Fluent Assertions会基于转换后的数值进行比较:

// 验证升序
list.Should().BeInAscendingOrder(x => double.Parse(x.stringProperty));

// 验证降序
list.Should().BeInDescendingOrder(x => double.Parse(x.stringProperty));

注意:如果字符串可能存在格式错误,建议在测试前确保数据格式合法,或者使用double.TryParse配合默认值处理异常情况。

方法2:使用自定义比较器

如果需要更灵活的比较逻辑,可以创建自定义比较器,再传给断言方法的重载版本:

// 创建基于数值比较的自定义比较器
var numericComparer = Comparer<MyObject>.Create((a, b) => 
    double.Parse(a.stringProperty).CompareTo(double.Parse(b.stringProperty)));

// 用自定义比较器验证升序
list.Should().BeInAscendingOrder(numericComparer);

// 用自定义比较器验证降序
list.Should().BeInDescendingOrder(numericComparer);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 12:22:19