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. Android ExpandableGridView的实现

    近期在做项目的时候碰到了这样一个布局 在android中有种实现折叠list方式是ExpandableListView  但是官方没有ExpandableGridView 那么怎么样用Expandab ...

  2. iOS小知识:使UIButton中的图片和文字实现左对齐

    UIButton setImage 和 setTitle之后,默认的 image和title 对齐方式是居中, 由于 title 长度不固定,所以如果要几个这样有image有title的按钮纵向排列对 ...

  3. github with msysgit:配置SSH Key

    Step 1: Check for SSH keys First, we need to check for existing ssh keys on your computer. Open up G ...

  4. nginx中error_page没有生效(nginx+passenger+rails)

    应用部署方式为 nginx + passenger + rails 当我想要用nginx来默认处理400以上状态时,发现在rails返回respose之后,nginx不会再次执行error_page( ...

  5. 解决JSP页面获取的数据库数据乱码问题

    将java项目部署到服务器,页面数据乱码: 解决:首先查看了数据库编码和jsp编码都是utf-8,说明jsp和数据库没问题,于是查看了tomcat设置的编码 没有设置编码,于是加了URIEncodin ...

  6. html5 兼容火狐 ev的事件

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. QL Server 2008 所有账号丢失sysadmin权限,sa账号亦没有开启,该如何解决??

    1. 用Run as a administrator打开命令提示符里输入NET STOP MSSQLSERVER, 即停止MSSQLSERVER运行. 2. 在命令提示符里输入 NET START M ...

  8. set和map的简单用法

    .set(集合)map(映射)都属于关联类容器 都支持查询一个元素是否存在并能够有效地获取元素. set集合的元素总是从小到大排列,set集合通过二分查找树实现.它具备以下两个特点: ①:独一无二的元 ...

  9. 转行进入IT前端,目标全栈

    选择进入IT这个行业,未来充满着挑战,未来充满着机遇,互联网已经走入高速稳定的发展正轨了,前端大时代也已经到来了.前端之路怎么走,前端需要不停地学习新知识,跟紧时代的步伐,成为全栈工程师是前端的目标. ...

  10. The note of Vue.js

    In computed field, increment operator is not supported.