LINQ标量操作

Oli*_*old 3 c# linq

出于好奇.任何人都可以想出一种方法来将剩余的两行代码与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)

jas*_*son 5

别.代码已经很清楚了.你为什么要跳过篮球来最终得到一些可读性较差的东西?

重命名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)

不要这样做.

  • @Oliver Weichhold:很好.看我的编辑.不要这样做.它导致小猫死亡. (2认同)