嗨,我有一个 List<decimal>
包含 ]0;1] 之间的值。
我想检查这些值的总计(或小计)是否等于 1(或几乎等于 1)。
我也可以使用 Linq
过滤或操作列表的函数。
期望的结果:
- 包含 {0.7, 0.7, 0.7} 的列表应该返回 false;
- 包含 {0.7, 0.3, 0.7} 的列表应返回 true;
- 包含 {0.777777, 0.2, 0.1} 的列表应该返回 false;
- 包含 {0.33333, 0.33333, 0.33333} 的列表应该返回 true;
- 包含 {0.4, 0.5, 0.6, 0.3} 的列表应返回 true。
显然,我想要性能成本尽可能低的东西。
最佳答案
已更新——现在不再重复求和 试试这个
bool isClose(IEnumerable<decimal> list, decimal epislon) {
return isClose(Enumerable.Empty<decimal>(),list,0,list.Sum(),epislon);
}
// Define other methods and classes here
bool isClose(IEnumerable<decimal> left,IEnumerable<decimal> right, decimal leftSum,decimal rightSum, decimal epsilon) {
if (leftSum>=1-epsilon && leftSum<=1+epsilon) return true;
if (leftSum>1+epsilon) return false;
if (leftSum+right.Sum()< 1-epsilon) return false;
if (!right.Any()) return false;
for (var i=0;i<right.Count();i++) {
var skip=right.Skip(i);
var newItem=skip.First();
if (isClose(left.Concat(skip.Take(1)),skip.Skip(1),leftSum+newItem,rightSum-newItem,epsilon)) return true;
}
return false;
}
isClose(new[] {0.7m,0.7m,0.7m},0.001m); // returns false
isClose(new[] {0.7m,0.3m,0.7m},0.001m); //returns true
isClose(new[] {0.777777m,0.2m,0.1m},0.001m); //returns false
isClose(new[] {0.33333m,0.33333m,0.33333m},0.001m); //returns true
编辑第 5 次测试
isClose(new[] {0.4m, 0.5m, 0.6m, 0.3m},0.001m); //returns true
关于c# - 验证十进制值列表(或该列表的子列表)是否可以等于某个总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11228261/