c# - 验证十进制值列表(或该列表的子列表)是否可以等于某个总和

标签 c# linq algorithm list

嗨,我有一个 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/

相关文章:

algorithm - 符号计算 Neville 算法的多项式

database - 在有序数字列表中查找数字记录的算法

c# - WebBrowser 控件 - 防止右键单击

c# - 在 asp.net mvc 3 中的 html 帮助器类的控件或扩展方法中包含 js/css 文件

c# - 如何在 IHttpModule 中测试 HttpApplication 事件

linq - Entity Framework 中多对多关系的计数

c# - 从 FirstOrDefault 中选择一个属性,以防 FirstOrDefault 返回 null

c# - 连接mysql最好的驱动是什么?

c# - 获取以下实体之间的差异 Linq to Entities

java - Java中的方法执行顺序排序