简单比较linq sort的效率,其实性能很低

本文通过实际代码演示了冒泡排序(Bubble Sort)与利用LINQ进行排序(LINQ Sort)两种方法,并比较了它们的时间效率。实验结果显示,冒泡排序用时约10毫秒,而LINQ排序则大约需要70毫秒。

bubble sort一般是10000 ticks(10ms) 而linq sort却是70000 (70ms)左右

 

Module 矩形排序模块 ' 定义多段线数据结构体 Private Structure PolylineData Public Polyline As AcadLWPolyline ' CAD多段线对象 Public CenterX As Double ' 中心点X坐标 Public CenterY As Double ' 中心点Y坐标 End Structure ' 判断是否在同一行(严格应用行容差) Private Function IsSameRow(y1 As Double, y2 As Double, rowTolerance As Double) As Boolean ' 比较Y坐标差值是否在容差范围内 Return Math.Abs(y1 - y2) <= rowTolerance End Function ' 判断是否在同一列(严格应用列容差) Private Function IsSameCol(x1 As Double, x2 As Double, colTolerance As Double) As Boolean ' 比较X坐标差值是否在容差范围内 Return Math.Abs(x1 - x2) <= colTolerance End Function ' 改进的分组函数(严格应用容差) Private Function GroupByTolerance(data As List(Of PolylineData), rowTolerance As Double, colTolerance As Double) As List(Of List(Of PolylineData)) ' 初始化分组列表 Dim groupedData As New List(Of List(Of PolylineData)) ' 对每个元素进行分组 For Each item In data Dim foundGroup = False ' 尝试将元素放入现有组 For Each group In groupedData ' 严格检查容差条件 If IsSameRow(group(0).CenterY, item.CenterY, rowTolerance) AndAlso IsSameCol(group(0).CenterX, item.CenterX, colTolerance) Then group.Add(item) foundGroup = True Exit For End If Next ' 未找到合适组则创建新组 If Not foundGroup Then groupedData.Add(New List(Of PolylineData) From {item}) End If Next Return groupedData End Function ' 完整排序函数(支持所有组合方向) Public Sub SortPolylines(polylines As List(Of AcadLWPolyline), rule As 排序规则, rowTolerance As Double, colTolerance As Double) ' 计算所有多段线中心点 Dim polylineData = polylines.Select(Function(p) Dim bounds = GetPolylineBounds(p) Return New PolylineData With { .Polyline = p, .CenterX = (bounds.MaxX + bounds.MinX) / 2, .CenterY = (bounds.MaxY + bounds.MinY) / 2 } End Function).ToList() ' 使用容差进行分组 Dim groupedData = GroupByTolerance(polylineData, rowTolerance, colTolerance) ' 根据排序规则处理分组 Select Case rule ' 1. 先行后列组合 Case 排序规则.先行后列_X升序_Y升序 ' 左下→右上 groupedData.Sort(Function(g1, g2) g1(0).CenterY.CompareTo(g2(0).CenterY)) ' Y升序 For Each group In groupedData group.Sort(Function(a, b) a.CenterX.CompareTo(b.CenterX)) ' X升序 Next Case 排序规则.先行后列_X升序_Y降序 ' 左上→右下 groupedData.Sort(Function(g1, g2) g2(0).CenterY.CompareTo(g1(0).CenterY)) ' Y降序 For Each group In groupedData group.Sort(Function(a, b) a.CenterX.CompareTo(b.CenterX)) ' X升序 Next Case 排序规则.先行后列_X降序_Y升序 ' 右下→左上 groupedData.Sort(Function(g1, g2) g1(0).CenterY.CompareTo(g2(0).CenterY)) ' Y升序 For Each group In groupedData group.Sort(Function(a, b) b.CenterX.CompareTo(a.CenterX)) ' X降序 Next Case 排序规则.先行后列_X降序_Y降序 ' 右上→左下 groupedData.Sort(Function(g1, g2) g2(0).CenterY.CompareTo(g1(0).CenterY)) ' Y降序 For Each group In groupedData group.Sort(Function(a, b) b.CenterX.CompareTo(a.CenterX)) ' X降序 Next ' 2. 先列后行组合 Case 排序规则.先列后行_Y升序_X升序 ' 左下→右上 groupedData.Sort(Function(g1, g2) g1(0).CenterX.CompareTo(g2(0).CenterX)) ' X升序 For Each group In groupedData group.Sort(Function(a, b) a.CenterY.CompareTo(b.CenterY)) ' Y升序 Next Case 排序规则.先列后行_Y升序_X降序 ' 右下→左上 groupedData.Sort(Function(g1, g2) g2(0).CenterX.CompareTo(g1(0).CenterX)) ' X降序 For Each group In groupedData group.Sort(Function(a, b) a.CenterY.CompareTo(b.CenterY)) ' Y升序 Next Case 排序规则.先列后行_Y降序_X升序 ' 左上→右下 groupedData.Sort(Function(g1, g2) g1(0).CenterX.CompareTo(g2(0).CenterX)) ' X升序 For Each group In groupedData group.Sort(Function(a, b) b.CenterY.CompareTo(a.CenterY)) ' Y降序 Next Case 排序规则.先列后行_Y降序_X降序 ' 右上→左下 groupedData.Sort(Function(g1, g2) g2(0).CenterX.CompareTo(g1(0).CenterX)) ' X降序 For Each group In groupedData group.Sort(Function(a, b) b.CenterY.CompareTo(a.CenterY)) ' Y降序 Next Case 排序规则.绘图顺序 ' 保持原顺序 ' 不进行排序 End Select ' 合并排序结果 Dim sortedPolylines As New List(Of AcadLWPolyline) For Each group In groupedData For Each item In group sortedPolylines.Add(item.Polyline) Next Next ' 更新原始集合 polylines.Clear() polylines.AddRange(sortedPolylines) End Sub ' 获取多段线边界 Private Function GetPolylineBounds(polyline As AcadLWPolyline) As Bounds Dim bounds As New Bounds Dim minPoint As Object = Nothing Dim maxPoint As Object = Nothing polyline.GetBoundingBox(minPoint, maxPoint) bounds.MinX = minPoint(0) bounds.MinY = minPoint(1) bounds.MaxX = maxPoint(0) bounds.MaxY = maxPoint(1) Return bounds End Function ' 边界结构体 Private Structure Bounds Public MinX As Double Public MinY As Double Public MaxX As Double Public MaxY As Double End Structure End Module 以上代码的排列组合不对,先行后列X逆序是右上角向左下角的,先行后列Y逆序是左下角向右上角的,先行后列X逆序Y逆序是右下角向左上角的,正序逻辑相反;先列后行X逆序是右上角向左下角的,先列后行Y逆序是左下角向右上角的,先列后行X逆序Y逆序是右下角向左上角的,正序逻辑相反;请把所有组合搞对,确保每种组合容差值生效。请修改后,在每行代码后注释,分别用1个模块回答完整,不要省略。
最新发布
08-11
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值