【发布时间】:2014-01-19 04:22:06
【问题描述】:
我有一个IEnumerable(Of Integer),想将每组三个连续整数相加,从第一个整数开始,到最后一个减二结束。
示例:我的整数是{0, 6, 2, 8, 2, 0, 3, 7, 1}。我想将其转换为{0+60+2, 600+20+8, 200+80+2, ...} = {62, 628, 282, 820, 203, 37, 371},然后将其存储在排序集中。请注意,我选择基数 10 来简化问题,实际上基数不同(集合中的最大值加 1,因此我的方法将为集合中三个数字的每个排列生成一个唯一 ID)。
我测试了三段不同的代码:
1)
sums = New SortedSet(Of Integer)()
For i = 0 To integers.Count - 3
sums.Add(integers(i) * 100 + integers(i + 1) * 10 + integers(i + 2))
Next
2)
sums = New SortedSet(Of Integer)(
integers.Take(integers.Count - 2).Select(
Function(val, index) val * 100 + integers(index + 1) * 10 + integers(index + 2)
)
)
3)
Dim num = integers.Count - 2
Dim intsX = integers.Take(num)
Dim intsY = integers.Skip(1).Take(num)
Dim intsZ = integers.Skip(2)
sums = New SortedSet(Of Integer)(
intsX.Zip(
intsY, Function(x, y) x * 100 + y * 10).Zip(
intsZ, Function(xy, z) xy + z)
)
这三种方法都有效,但我对大约 62k 整数集的测试表明,执行时间存在显着差异:方法 1):1.8-2 秒,方法 2:1.4-1.5 秒,方法 3:0.75-0.77 秒.
由于性能对我的项目至关重要,我仍然不确定这是否是实现我想要的最佳代码。有没有人有我可以测试的另一个想法?
【问题讨论】:
标签: vb.net performance linq