是的在 C# CAD 二次开发中DoubleCollection和Listdouble可以互相转换。DoubleCollection是 AutoCAD .NET API 中用于存储双精度浮点数集合的特定类型而Listdouble是标准的 .NET 泛型集合。两者之间的转换通常通过构造函数或 LINQ 方法实现。1.DoubleCollection转换为Listdouble可以直接使用System.Linq的ToList()扩展方法进行转换因为DoubleCollection实现了IEnumerabledouble接口。using System.Linq; using Autodesk.AutoCAD.DatabaseServices; // 假设有一个 DoubleCollection 对象 DoubleCollection doubleCollection GetDoubleCollectionFromSomewhere(); // 转换为 Listdouble Listdouble doubleList doubleCollection.ToList();2.Listdouble转换为DoubleCollection可以通过DoubleCollection的构造函数它接受一个IEnumerabledouble参数因此可以直接传入Listdouble。using Autodesk.AutoCAD.DatabaseServices; // 假设有一个 Listdouble 对象 Listdouble doubleList new Listdouble { 1.1, 2.2, 3.3, 4.4 }; // 转换为 DoubleCollection DoubleCollection doubleCollection new DoubleCollection(doubleList);3. 性能与内存考虑对于大型集合直接转换可能会产生完整集合的副本。如果需要在两者之间进行频繁操作或关注性能可以考虑以下方法延迟转换仅在需要特定 API例如某些 AutoCAD 方法要求DoubleCollection参数时进行转换。避免重复转换如果数据源是Listdouble但后续多个操作都需要DoubleCollection可考虑缓存转换后的对象。4. 转换方法对比转换方向推荐方法代码示例说明DoubleCollection→Listdouble使用ToList()Listdouble list doubleCollection.ToList();简洁利用 LINQ需引用System.Linq。Listdouble→DoubleCollection使用构造函数DoubleCollection collection new DoubleCollection(list);直接效率高是标准做法。5. 完整示例以下是一个在 AutoCAD 命令中使用的完整示例演示了如何获取多段线的顶点坐标并在两种集合类型间转换。using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System.Collections.Generic; using System.Linq; [CommandMethod(TestConversion)] public void TestConversion() { Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; Editor ed doc.Editor; using (Transaction tr db.TransactionManager.StartTransaction()) { // 1. 选择一条多段线 PromptEntityOptions peo new PromptEntityOptions( 选择一条多段线: ); peo.SetRejectMessage( 请选择一条多段线。); peo.AddAllowedClass(typeof(Polyline), true); PromptEntityResult per ed.GetEntity(peo); if (per.Status ! PromptStatus.OK) return; Polyline pline tr.GetObject(per.ObjectId, OpenMode.ForRead) as Polyline; if (pline null) return; // 2. 获取顶点坐标并存入 Listdouble Listdouble vertexList new Listdouble(); for (int i 0; i pline.NumberOfVertices; i) { Point2d pt pline.GetPoint2dAt(i); vertexList.Add(pt.X); vertexList.Add(pt.Y); } ed.WriteMessage($ Listdouble 顶点数: {vertexList.Count / 2}); // 3. Listdouble 转换为 DoubleCollection DoubleCollection vertexCollection new DoubleCollection(vertexList); ed.WriteMessage($ DoubleCollection 元素数: {vertexCollection.Count}); // 4. DoubleCollection 转换回 Listdouble Listdouble convertedBackList vertexCollection.ToList(); ed.WriteMessage($ 转换回的 Listdouble 元素数: {convertedBackList.Count}); // 5. 验证转换正确性 (可选) bool areEqual vertexList.SequenceEqual(convertedBackList); ed.WriteMessage($ 两次转换后数据是否一致: {areEqual}); tr.Commit(); } }
DoubleCollection与Listdouble互转技巧
发布时间:2026/7/15 12:41:18
是的在 C# CAD 二次开发中DoubleCollection和Listdouble可以互相转换。DoubleCollection是 AutoCAD .NET API 中用于存储双精度浮点数集合的特定类型而Listdouble是标准的 .NET 泛型集合。两者之间的转换通常通过构造函数或 LINQ 方法实现。1.DoubleCollection转换为Listdouble可以直接使用System.Linq的ToList()扩展方法进行转换因为DoubleCollection实现了IEnumerabledouble接口。using System.Linq; using Autodesk.AutoCAD.DatabaseServices; // 假设有一个 DoubleCollection 对象 DoubleCollection doubleCollection GetDoubleCollectionFromSomewhere(); // 转换为 Listdouble Listdouble doubleList doubleCollection.ToList();2.Listdouble转换为DoubleCollection可以通过DoubleCollection的构造函数它接受一个IEnumerabledouble参数因此可以直接传入Listdouble。using Autodesk.AutoCAD.DatabaseServices; // 假设有一个 Listdouble 对象 Listdouble doubleList new Listdouble { 1.1, 2.2, 3.3, 4.4 }; // 转换为 DoubleCollection DoubleCollection doubleCollection new DoubleCollection(doubleList);3. 性能与内存考虑对于大型集合直接转换可能会产生完整集合的副本。如果需要在两者之间进行频繁操作或关注性能可以考虑以下方法延迟转换仅在需要特定 API例如某些 AutoCAD 方法要求DoubleCollection参数时进行转换。避免重复转换如果数据源是Listdouble但后续多个操作都需要DoubleCollection可考虑缓存转换后的对象。4. 转换方法对比转换方向推荐方法代码示例说明DoubleCollection→Listdouble使用ToList()Listdouble list doubleCollection.ToList();简洁利用 LINQ需引用System.Linq。Listdouble→DoubleCollection使用构造函数DoubleCollection collection new DoubleCollection(list);直接效率高是标准做法。5. 完整示例以下是一个在 AutoCAD 命令中使用的完整示例演示了如何获取多段线的顶点坐标并在两种集合类型间转换。using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using System.Collections.Generic; using System.Linq; [CommandMethod(TestConversion)] public void TestConversion() { Document doc Application.DocumentManager.MdiActiveDocument; Database db doc.Database; Editor ed doc.Editor; using (Transaction tr db.TransactionManager.StartTransaction()) { // 1. 选择一条多段线 PromptEntityOptions peo new PromptEntityOptions( 选择一条多段线: ); peo.SetRejectMessage( 请选择一条多段线。); peo.AddAllowedClass(typeof(Polyline), true); PromptEntityResult per ed.GetEntity(peo); if (per.Status ! PromptStatus.OK) return; Polyline pline tr.GetObject(per.ObjectId, OpenMode.ForRead) as Polyline; if (pline null) return; // 2. 获取顶点坐标并存入 Listdouble Listdouble vertexList new Listdouble(); for (int i 0; i pline.NumberOfVertices; i) { Point2d pt pline.GetPoint2dAt(i); vertexList.Add(pt.X); vertexList.Add(pt.Y); } ed.WriteMessage($ Listdouble 顶点数: {vertexList.Count / 2}); // 3. Listdouble 转换为 DoubleCollection DoubleCollection vertexCollection new DoubleCollection(vertexList); ed.WriteMessage($ DoubleCollection 元素数: {vertexCollection.Count}); // 4. DoubleCollection 转换回 Listdouble Listdouble convertedBackList vertexCollection.ToList(); ed.WriteMessage($ 转换回的 Listdouble 元素数: {convertedBackList.Count}); // 5. 验证转换正确性 (可选) bool areEqual vertexList.SequenceEqual(convertedBackList); ed.WriteMessage($ 两次转换后数据是否一致: {areEqual}); tr.Commit(); } }