出于好奇.任何人都可以想出一种方法来将剩余的两行代码与LINQ操作集成在一起吗?
var code = string.Format("{0:00000}{1:000000000}{2:0000000}", SelectedPreset.Prefix, i, SelectedPreset.Amount);
// calculate checksum
var checksum = code
.Reverse()
.Select((c, index) => new { IsOdd = (index & 1) == 1, Value = (int) Char.GetNumericValue(c) })
.Select(x => x.IsOdd ? x.Value : x.Value*3)
.Aggregate((a, b) => a + b);
var rounded = ((checksum + 10 - 1)/10)*10;
checksum = rounded - checksum;
Run Code Online (Sandbox Code Playgroud)
别.代码已经很清楚了.你为什么要跳过篮球来最终得到一些可读性较差的东西?
重命名checksum.类似的东西(你可以想出一个更好的名字;关键是checksum如果它实际上不是校验和,就不要调用第一个计算):
var intermediate = // your LINQ expression
var rounded = ((intermediate + 10 -1) / 10) * 10;
var checksum = rounded - intermediate;
Run Code Online (Sandbox Code Playgroud)
另外,改变
IsOdd = (index & 1) == 1
Run Code Online (Sandbox Code Playgroud)
至
IsIndexOdd = index % 2 != 0
Run Code Online (Sandbox Code Playgroud)
如果你真的必须知道:
var checksum =
new [] {
code
.Reverse()
.Select((c, index) => new {
IsIndexOdd = index % 2 != 0,
Value = (int) Char.GetNumericValue(c)
})
.Select(x => x.IsIndexOdd ? x.Value : 3 * x.Value)
.Aggregate((a, b) => a + b)
}
.Select(x => new { Rounded = ((x + 10 - 1) / 10) * 10, Intermediate = x })
.Select(x => x.Rounded - x.Intermediate)
.Single();
Run Code Online (Sandbox Code Playgroud)
不要这样做.