DoubleCollection与Listdouble互转技巧

是的,在 C# CAD 二次开发中,DoubleCollectionList<double> 可以互相转换。DoubleCollection 是 AutoCAD .NET API 中用于存储双精度浮点数集合的特定类型,而 List<double> 是标准的 .NET 泛型集合。两者之间的转换通常通过构造函数或 LINQ 方法实现。

1. DoubleCollection 转换为 List<double>

可以直接使用 System.LinqToList() 扩展方法进行转换,因为 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. 转换方法对比

转换方向推荐方法代码示例说明
DoubleCollectionList<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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值