在List的上限和下限之间查找值

时间:2016-08-12 07:22:30

标签: c# linq

我目前按以下方式计算税率

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
<body ng-app="myApp">
<div ng-controller="mainController">

<select name="reporttype"id="reporttype" ng-init="reporttype='1115'" ng-model="reporttype">
                <option value="1115">Previous Day Composite Report</option>
                <option value="1114">ACH Receive</option>
              </select>
<select name="outputformat" id="outputformat" ng-model="outputformat" ng-options="format for format in outputformats | outputformatfilter: reporttype:this">    
              </select> Value : {{outputformat}}

</div>

</body>

LINQ中是否有替代方法可以执行此操作而不是使用这种老式方法?看起来非常接近this,但有点不同。

2 个答案:

答案 0 :(得分:4)

如果我理解正确,这就是你想要的:

var result = taxes.OrderBy(item => item.Limit)
                  .SkipWhile(item => item.Limit < testValue)
                  .FirstOrDefault()?.Value;

它会将您的收藏从最小的Limit订购到最大,然后Skip,直到它达到等于或大于Limit的{​​{1}}。因为收集是按顺序排列的,然后是testValue及其值。

或者:

FirstOrDefault

这种方式从不同的方向看待问题。只选择相等或var result = taxes.Where(item => item.Limit >= testValue ) .OrderBy(item => item.Limit) .FirstOrDefault()?.Value; 的项目,然后按顺序排列第一个。

答案 1 :(得分:3)

作为 Linq替代我建议使用二进制搜索,前提是taxes已排序:

int index = taxes.BinarySearch(
  new TaxBracket(testValue, -1), // -1: this parameter is ignored
  Comparer<TaxBracket>.Create((left, right) => left.Limit.CompareTo(right.Limit)));

if (index < 0)
  index = ~index - 1; // in between of two indexes

var result = taxes[index].Value;

使用 long 列表时,二进制搜索非常有用(算法可确保O(log(N))复杂度,当 Linq 提供O(N)一个时;但是当taxes很小时, Linq SkipWhile(请参阅Gilad Green的回答)更具可读性