using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Diagnostics; using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.EditorInput; /// <summary>
/// 选择集比较
/// </summary>
///
[assembly: CommandClass(typeof(TipsAndTricks.Class1))]
namespace TipsAndTricks
{ public class Class1
{
[CommandMethod("Test")]
public void test()
{
DoFilter(FilterByEdSelectionFilter);
DoFilter(FilterByLinq);
DoFilter(FilterByForeach);
} private static void DoFilter(Action action)
{
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
var sw = Stopwatch.StartNew();
action();
sw.Stop();
ed.WriteMessage($"{sw.Elapsed.TotalMilliseconds}\n");
} public void FilterByEdSelectionFilter()
{
var ed = Application.DocumentManager.MdiActiveDocument.Editor;
TypedValue[] circType = new TypedValue[1];
circType.SetValue(new TypedValue((int)DxfCode.Start, "CIRCLE"), 0);
SelectionFilter filtCirc = new SelectionFilter(circType);
PromptSelectionResult resPrompt;
resPrompt = ed.SelectAll(filtCirc);
if (resPrompt.Status == PromptStatus.OK)
{
SelectionSet circSelSet = resPrompt.Value;
ed.WriteMessage($"ed count: {circSelSet.Count.ToString()}\n");//vs2015 新语法 可以正常编译.net 4.0的项目
}
} public void FilterByLinq()
{
var db = HostApplicationServices.WorkingDatabase;
var ed = Application.DocumentManager.MdiActiveDocument.Editor; using (var tr = db.TransactionManager.StartTransaction())
{
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
var mspace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false) as BlockTableRecord;
var circles = mspace.Cast<ObjectId>()
.Where(id => id.ObjectClass.DxfName.Equals("CIRCLE")); //过滤条件很关键,对性能影响很大
ed.WriteMessage($"linq count: {circles.Count().ToString()}\n"); }
} public void FilterByForeach()
{
var db = HostApplicationServices.WorkingDatabase;
Editor ed = Application.DocumentManager.MdiActiveDocument.Editor; using (var tr = db.TransactionManager.StartTransaction())
{
var bt = tr.GetObject(db.BlockTableId, OpenMode.ForRead) as BlockTable;
var mspace = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForRead, false) as BlockTableRecord;
var circles = new List<ObjectId>();
foreach (ObjectId id in mspace)
{
var dbObj = tr.GetObject(id, OpenMode.ForRead) as Circle;
if (dbObj != null)
{
circles.Add(dbObj.Id);
}
}
ed.WriteMessage($"Foreach count: {circles.Count.ToString()}\n");
}
}
}
}

目前看来 linq 效率挺高的,以后开发可以放心用linq做二次开发了.

------------------------

4m的dwg 图纸 测试结果:  

ed count: 877
96.0967
linq count: 877
67.8107
Foreach count: 877
156.6604

AutoCAD .net 开发 SelectionFilter Foreach Linq 性能比较的更多相关文章

  1. 教你50招提升ASP.NET性能(二十六):对于开发人员的数据库性能技巧

    Database Performance Tips for Developers对于开发人员的数据库性能技巧 As a developer you may or may not need to go ...

  2. mybatis 中 foreach 的性能问题及调优

    1.mybatis中最初的sql语句 SELECT 参数1, 参数2, 参数3 FROM 表 WHERE 条件参数1 in <foreach item="item" inde ...

  3. 测试开发jmeter forEach控制器

    测试开发jmeter forEach控制器 forEach控制器的使用场景:主要是对大量数据轮询就行接口请求 forEach控制器的使用前提:将数据进行参数化 测试开发jmeter forEach控制 ...

  4. linq性能剖析

    Orcas(VS2008&Framework3.5)给我们带来了很多令人兴奋的新特性,尤其是LINQ的引进,可以说方便了一大批开发 人员和框架设计人员.过去,当我们使用O/RMapping的一 ...

  5. 开发Android应用 提升性能的小技巧

    前 言 2015年,Android OS 目前在手机操作系统的市场占有率已达59%,权威机构预计,Android市场占有率在2016年将达到63%,由于Android的开放性,未来占有率还将不断增加, ...

  6. 基于VUE的SPA单页应用开发-加载性能篇

    1.基于异步数据的vue页面刷新 先看看基于异步数据的vue页面刷新后,都发生了啥- 如图所示: 图1 基于异步数据的vue页面刷新 网络请求图 步骤如下: step1:请求页面: step2:请求页 ...

  7. 并行开发 8.用VS性能向导解剖你的程序

    原文:8天玩转并行开发——第八天 用VS性能向导解剖你的程序 最后一篇,我们来说说vs的“性能向导",通常我们调试程序的性能一般会使用Stopwatch,如果希望更加系统的了解程序,我们就需 ...

  8. for/foreach/linq效率测试

    ; Random r = new Random(); List<byte> list = new List<byte>(); Console.WriteLine("开 ...

  9. Android开发学习之路--性能优化之常用工具

      android性能优化相关的开发工具有很多很多种,这里对如下六个工具做个简单的使用介绍,主要有Android开发者选项,分析具体耗时的Trace view,布局复杂度工具Hierarchy Vie ...

随机推荐

  1. wikioi 1166 矩阵取数游戏

    这题做了至少5个小时= =,虽然思路一开始就确定了,但是因为一些错误,比如dp公式里的+打成*,状态未初始化等原因调了好久(>_<) 最后还是参照着别人的解题报告找到错误. 大数模板直接拿 ...

  2. PHP收藏

    PHP打印测试,PHP调试技巧    PHP header函数使用大全    PHP面向对象(OOP)编程入门教程 小片段: PHP保留2位小数 格式化小数.浮点数 header('Content-T ...

  3. Java 多线程编程

    1.synchronized/wait/notify package javamultithread; import java.util.logging.Level; import java.util ...

  4. java从基础知识(八)泛型

    1.什么是泛型? 泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法 ...

  5. AngularJS下拉列表select在option动态变化之后多出了一个错误项的问题

    场景: Select初始化之后,选中select的某个选项 通过AngularJS更新select的选项 错误写法: HTML(使用ng-repeat) <div ng-app="Te ...

  6. react+redux官方实例TODO从最简单的入门(5)-- 查

    上一篇文章<改>实现了,最后一个功能--<查>! 这个查是稍微要复杂一点的功能,官方实现的就是一个过滤数组的效果,然后展示出来,这里有3个状态,all,completed,ac ...

  7. html 标签

    CSS : overflow : hidden   --  就是给一个盒子定义了一个显示范围.内部的物体.只有在这个范围内部才会被显示.不然就被隐藏. overflow-x overflow-y 控制 ...

  8. Qt - 错误总结 - QObject::connect: Cannot queue arguments of type 'PVCI_CAN_OBJ' (Make sure 'PVCI_CAN_OBJ' is registered using qRegisterMetaType().)

    背景:一个线程通过signal-slot发送PVCI_CAN_OBJ类型的值到主线程中, 错误提示: QObject::connect: Cannot queue arguments of type ...

  9. Coding List

    决定还是用回.net吧,一个人瞎搞比较快,在这里把进展做个简单的记录.

  10. MySql 里的IFNULL、NULLIF和ISNULL用法

    MySql 里的IFNULL.NULLIF和ISNULL用法 mysql中isnull,ifnull,nullif的用法如下: isnull(expr) 的用法: 如expr 为null,那么isnu ...