如何在单元测试中访问多维列表元素并比较?遇SingleOrDefault报错
问题分析与解决
错误原因
你遇到的System.InvalidOperationException是因为SingleOrDefault()方法的特性:它要求目标序列只能有0个或1个元素,但你的filteredResults列表中存在多个元素,所以触发了这个异常。
满足需求的正确代码
你的需求是检查列表中是否存在savingsGasPerYear == 1的元素,若存在则测试失败。应该用Any()方法来判断是否存在符合条件的元素,代码修改如下:
List<CalculationResult> results = CheckStepSix(); List<CalculationResult> filteredResults = filterCalculations(results); Console.WriteLine($"{filteredResults.Count} results"); // 检查是否有任意元素的savingsGasPerYear等于1 if (filteredResults.Any(r => r.savingsGasPerYear == 1)) { Console.WriteLine("error"); Assert.Fail(); } else { Console.WriteLine("success"); }
如何访问列表中的元素
针对List<CalculationResult>这类列表,常见的元素访问方式有三种:
1. 遍历所有元素
用foreach循环逐个处理每个元素:
foreach (var result in filteredResults) { // 访问当前元素的属性 var gasSavings = result.savingsGasPerYear; Console.WriteLine($"年度节油:{gasSavings}"); }
2. 通过索引访问指定位置的元素
列表是有序集合,元素索引从0开始,可以直接通过下标取值:
// 确保列表不为空,避免索引越界 if (filteredResults.Count > 0) { // 获取第一个元素 var firstResult = filteredResults[0]; Console.WriteLine(firstResult.savingsGasPerYear); // 获取第三个元素(索引为2) if (filteredResults.Count > 2) { var thirdResult = filteredResults[2]; } }
3. 查找单个符合条件的元素
如果需要找到第一个符合条件的元素(或判断是否存在),可以用FirstOrDefault()(不会因多个元素抛异常):
// 找到第一个savingsGasPerYear等于1的元素,不存在则返回null var target = filteredResults.FirstOrDefault(r => r.savingsGasPerYear == 1); if (target != null) { // 存在符合条件的元素,执行失败逻辑 Assert.Fail(); }
内容的提问来源于stack exchange,提问作者NietTeDoen
相关产品推荐
相关产品推荐

