我目前按以下方式计算税率
<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,但有点不同。
答案 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的回答)更具可读性