如何用LINQ计算C# Dictionary中各列表前两项的总平均值
使用LINQ计算字典中各列表前两个元素的总平均值
当然可以用LINQ优雅地实现这个需求,完全不用写繁琐的循环!这里直接给你对应的代码,再一步步解释逻辑:
核心实现代码
private Dictionary<int, List<float>> _myValues = new Dictionary<int, List<float>> { {1, new List<float>{0.1f, 0.2f, 0.3f}}, {2, new List<float>{0.4f, 0.5f, 0.6f, 0.7f}}, {3, new List<float>{0.8f}} }; // 计算总平均值 var totalAverage = _myValues.Values .SelectMany(list => list.Take(2)) // 提取每个列表的前2个元素并展开为单一序列 .Average(); // 计算序列的平均值
代码逻辑拆解
_myValues.Values:先获取字典中所有的List<float>集合,也就是示例里的三个列表。SelectMany(list => list.Take(2)):这一步是关键:- 对每个列表调用
Take(2),不管列表长度是1还是更多,都会提取前2个元素(长度不足2时就取现有所有元素); SelectMany会把这些分散的元素合并成一个连续的float序列,对应示例里就是[0.1f, 0.2f, 0.4f, 0.5f, 0.8f]。
- 对每个列表调用
.Average():直接计算这个合并后序列的平均值,示例中结果为0.4f,和你手动计算的结果一致。
额外场景处理(可选)
如果你的字典中可能存在空列表,直接调用Average()会抛出InvalidOperationException(因为空序列无法计算平均值)。这时可以添加DefaultIfEmpty()来兜底,当所有元素都为空时返回0.0f:
var totalAverage = _myValues.Values .SelectMany(list => list.Take(2)) .DefaultIfEmpty() .Average();
内容的提问来源于stack exchange,提问作者Wadjey
相关产品推荐
相关产品推荐

