是的,在 C# CAD 二次开发中,DoubleCollection 和 List<double> 可以互相转换。DoubleCollection 是 AutoCAD .NET API 中用于存储双精度浮点数集合的特定类型,而 List<double> 是标准的 .NET 泛型集合。两者之间的转换通常通过构造函数或 LINQ 方法实现。
1. DoubleCollection 转换为 List<double>
可以直接使用 System.Linq 的 ToList() 扩展方法进行转换,因为 DoubleCollection 实现了 IEnumerable<double> 接口。
using System.Linq;
using Autodesk.AutoCAD.DatabaseServices;
// 假设有一个 DoubleCollection 对象
DoubleCollection doubleCollection = GetDoubleCollectionFromSomewhere();
// 转换为 List<double>
List<double> doubleList = doubleCollection.ToList();
2. List<double> 转换为 DoubleCollection
可以通过 DoubleCollection 的构造函数,它接受一个 IEnumerable<double> 参数,因此可以直接传入 List<double>。
using Autodesk.AutoCAD.DatabaseServices;
// 假设有一个 List<double> 对象
List<double> doubleList = new List<double> { 1.1, 2.2, 3.3, 4.4 };
// 转换为 DoubleCollection
DoubleCollection doubleCollection = new DoubleCollection(doubleList);
3. 性能与内存考虑
对于大型集合,直接转换可能会产生完整集合的副本。如果需要在两者之间进行频繁操作或关注性能,可以考虑以下方法:
- 延迟转换:仅在需要特定 API(例如,某些 AutoCAD 方法要求
DoubleCollection参数)时进行转换。 - 避免重复转换:如果数据源是
List<double>,但后续多个操作都需要DoubleCollection,可考虑缓存转换后的对象。
4. 转换方法对比
| 转换方向 | 推荐方法 | 代码示例 | 说明 |
|---|---|---|---|
DoubleCollection → List<double> | 使用 ToList() | List<double> list = doubleCollection.ToList(); | 简洁,利用 LINQ,需引用 System.Linq。 |
List<double> → 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. 获取顶点坐标并存入 List<double>
List<double> vertexList = new List<double>();
for (int i = 0; i < pline.NumberOfVertices; i++)
{
Point2d pt = pline.GetPoint2dAt(i);
vertexList.Add(pt.X);
vertexList.Add(pt.Y);
}
ed.WriteMessage($"
List<double> 顶点数: {vertexList.Count / 2}");
// 3. List<double> 转换为 DoubleCollection
DoubleCollection vertexCollection = new DoubleCollection(vertexList);
ed.WriteMessage($"
DoubleCollection 元素数: {vertexCollection.Count}");
// 4. DoubleCollection 转换回 List<double>
List<double> convertedBackList = vertexCollection.ToList();
ed.WriteMessage($"
转换回的 List<double> 元素数: {convertedBackList.Count}");
// 5. 验证转换正确性 (可选)
bool areEqual = vertexList.SequenceEqual(convertedBackList);
ed.WriteMessage($"
两次转换后数据是否一致: {areEqual}");
tr.Commit();
}
}
319

被折叠的 条评论
为什么被折叠?



