SortedList 类(using System.Collections)

本文详细介绍了SortedList类的使用方法,包括添加、删除元素的操作,以及如何通过键或索引访问元素。此外,还介绍了与索引相关的操作和其他常用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表示键/值对的集合,这些键和值按键排序并可按照键和索引访问。
SortedList最合适对一列健/值对 进行排序,在排序时,是对键进行排序,

 

SortedList 是 Hashtable 和 Array 的混合。当使用 Item 索引器属性按照元素的键访问元
素时,其行为类似于 Hashtable。当使用 GetByIndex 或 SetByIndex 按照元素的索引访问元
素时,其行为类似于 Array。
SortedList 在内部维护两个数组以将数组存储到列表中;即,一个数组用于键,另一个数组
用于相关联的值。每个元素都是一个可作为 DictionaryEntry 对象进行访问的键/值对。键不
能为空引用(Visual Basic 中为 Nothing),但值可以。
SortedList 的容量是列表可拥有的元素数。随着向 SortedList 中添加元素,容量通过重新
分配按需自动增加。可通过调用 TrimToSize 或通过显式设置 Capacity 属性减少容量。
SortedList 的元素将按照特定的 IComparer 实现(在创建 SortedList 时指定)或按照键本
身提供的 IComparable 实现并依据键来进行排序。不论在哪种情况下,SortedList 都不允许
重复键。
索引顺序基于排序顺序。当添加元素时,元素将按正确的排序顺序插入 SortedList,同时索
引会相应地进行调整。若移除了元素,索引也会相应地进行调整。因此,当在 SortedList 中
添加或移除元素时,特定键/值对的索引可能会更改。
由于要进行排序,所以在 SortedList 上操作比在 Hashtable
上操作要慢。但是,SortedList 允许通过相关联键或通过索引对值进行访问,可提供更大的
灵活性。

 

一。添加删除
1。public virtual void Add(object key,object value);
此集合中的索引从零开始。
将带有指定键和值的元素添加到 SortedList。
通过设置 SortedList 中不存在的键的值,Item
属性也可用于添加新元素。例如:myCollection["myNonexistentKey"] = myValue。但是,如
果指定的键已经存在于 SortedList 中,则设置 Item 属性将改写旧值。相比之下,Add 方法
不修改现有元素。
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
//结果为d c b a,所以可知是按键排序,而非值排序
DropDownList3.DataSource = sList;
DropDownList3.DataTextField = "Key";
DropDownList3.DataValueField = "Value";
DropDownList3.DataBind();

 

2。public virtual void Remove(object key);
从 SortedList 中移除带有指定键的元素
如果 SortedList 不包含带有指定键的元素,则 SortedList 保持不变。不引发异常
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
//sList.Remove("b"); 错误,是按key删除,而非Value
sList.Remove(3); //删除了[3,"b"]
DropDownList3.DataSource = sList;
DropDownList3.DataTextField = "Key";
DropDownList3.DataValueField = "Value";
DropDownList3.DataBind();

 

3。public virtual void RemoveAt(int index);
移除 SortedList 的指定索引处的元素。
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
sList.RemoveAt(3); //删除的是[4,"a"],这里的参数是索引号,而非键值,
                   //与sList.Remove(3)不同; sList.Remove(3)删除了[3,"b"]
DropDownList3.DataSource = sList;
DropDownList3.DataTextField = "Key";
DropDownList3.DataValueField = "Value";
DropDownList3.DataBind();

 

4。public virtual void Clear();
从 SortedList 中移除所有元素
Count 设置为零。Capacity 保持不变。若要重置 SortedList 的容量,请调用 TrimToSize
或直接设置 Capacity 属性。截去空 SortedList 会将 SortedList 的容量设置为默认容量,
而不是零

 

二。与索引有关的操作
1。public virtual void SetByIndex(int index,object value);
替换 SortedList 中指定索引处的值。
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
sList.SetByIndex(1,"dddddd"); //1为索引,如果Count<2,则出错,也就是说必须存在
                          //而sList[2] = "dddddd";不存在这种现象,
                            //也就是说sList[2] = "dddddd"是
                               //如果键存在在修改值,不存在则添加
DropDownList3.DataSource = sList;
DropDownList3.DataTextField = "Key";
DropDownList3.DataValueField = "Value";
DropDownList3.DataBind();

 

2。public virtual object GetByIndex(int index);
获取 SortedList 的指定索引处的值。
index必须小于Count,否则出错
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
//sList.Clear();
int nIndex = 2;
if (nIndex<sList.Count)
 {
   Label3.Text = sList.GetByIndex(nIndex).ToString();
 }
else
 {
 Label3.Text = "nIndex>=Count";
 }

 

3.public virtual int IndexOfKey(object key);
返回 SortedList 中指定键的从索引
这是Hashtable所没有的,因为Hashtable没有有序这个概念,它的排序是内部的

 

4.public virtual int IndexOfValue(object value);
返回指定的值在 SortedList 中第一个匹配项的索引
这是Hashtable所没有的,因为Hashtable没有有序这个概念,它的排序是内部的
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
sList.Add(5,"d");
int nIndex = 0;
nIndex = sList.IndexOfKey(1); //为0
nIndex = sList.IndexOfValue("d"); //值匹配的有两个,这时返回第一个匹配的,所以为0

 

三。其他
1.public virtual object GetKey(int index);
获取 SortedList 的指定索引处的键
这也是Hashtable所不可能有的

 

2.public virtual IList GetKeyList();
获取 SortedList 中的键
SortedList sList = new SortedList();
sList.Add(1,"d");
sList.Add(2,"c");
sList.Add(3,"b");
sList.Add(4,"a");
sList.Add(5,"d");
Label3.Text = "";
IList iList = sList.GetKeyList();
for (int i=0; i<sList.Count; i++)
{
 Label3.Text += iList[i].ToString();
 Label3.Text += " ";
}
注:IList 接口,表示可按照索引单独访问的一组对象,其中有一个Item属性,在C#也就就是
索引器

 

3.public virtual IList GetValueList();
获取 SortedList 中的值

 

4.public virtual bool Contains(object key);
确定 SortedList 是否包含特定键

 

5.public virtual bool ContainsKey(object key);
确定 SortedList 是否包含特定键
与Contains(object key);完全同
6.public virtual bool ContainsValue(object value);
确定 SortedList 是否包含特定值
上述这三个函数与Hashtable完全相同

 

7.public virtual void TrimToSize();
将容量设置为 SortedList 中元素的实际数目
 
using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using ClosedShapeProcessor.Geometry; using ClosedShapeProcessor.Models; using ClosedShapeProcessor.UI; using ClosedShapeProcessor.Utils; using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; using Application = Autodesk.AutoCAD.ApplicationServices.Application; namespace ClosedShapeProcessor { public class Commands { [CommandMethod("ProcessShapes")] public void ProcessShapes() { Document doc = Application.DocumentManager.MdiActiveDocument; Database db = doc.Database; Editor ed = doc.Editor; try { // 选择图形 PromptSelectionOptions selOpts = new PromptSelectionOptions { MessageForAdding = "\n选择封闭图形(圆、多段线、椭圆): " }; PromptSelectionResult selResult = ed.GetSelection(selOpts); if (selResult.Status != PromptStatus.OK) return; List<ShapeData> shapeDataList = new List<ShapeData>(); int counter = 1; using (Transaction tr = db.TransactionManager.StartTransaction()) { foreach (SelectedObject selObj in selResult.Value) { Entity ent = tr.GetObject(selObj.ObjectId, OpenMode.ForRead) as Entity; if (ent == null) continue; ShapeHandler handler = GetShapeHandler(ent); if (handler == null) continue; ShapeData data = handler.ProcessShape(ent, counter++); if (data != null) { shapeDataList.Add(data); } } tr.Commit(); } if (shapeDataList.Count == 0) { ed.WriteMessage("\n未找到有效的封闭图形"); return; } // 显示结果窗口 using (ResultsForm resultsForm = new ResultsForm(shapeDataList)) { if (resultsForm.ShowDialog() == DialogResult.OK) { // 在AutoCAD中创建表格 Table table = CreateTable(resultsForm.SortedData, db); InsertTable(table, ed); } } } catch (System.Exception ex) // 明确指定System.Exception { ed.WriteMessage($"\n错误: {ex.Message}"); } } private ShapeHandler GetShapeHandler(Entity ent) { switch (ent) { case Circle _: return new CircleHandler(); case Polyline pl when pl.Closed || GeometryHelper.IsPolylineClosed(pl): return new PolylineHandler(); case Ellipse _: // 椭圆处理器实现似 return null; // 简化示例 default: return null; } } private Table CreateTable(List<ShapeData> shapeData, Database db) { // 创建表格对象 Table table = new Table(); table.SetDatabaseDefaults(db); table.Position = Point3d.Origin; table.TableStyle = db.Tablestyle; // 确定列数(使用第一个数据的列数) int colCount = shapeData.First().GetColumnNames().Length; Document document = table.Columns.Add(colCount, 25); // 添加标题行 string[] headers = shapeData.First().GetColumnNames(); for (int i = 0; i < headers.Length; i++) { table.Cells[0, i].TextString = headers[i]; } // 添加数据行 for (int i = 0; i < shapeData.Count; i++) { string[] values = shapeData[i].GetValues(); for (int j = 0; j < values.Length; j++) { table.Cells[i + 1, j].TextString = values[j]; } } return table; } private void InsertTable(Table table, Editor ed) { using (Transaction tr = ed.Document.Database.TransactionManager.StartTransaction()) { BlockTable bt = tr.GetObject(ed.Document.Database.BlockTableId, OpenMode.ForRead) as BlockTable; BlockTableRecord btr = tr.GetObject(bt[BlockTableRecord.ModelSpace], OpenMode.ForWrite) as BlockTableRecord; PromptPointResult ppr = ed.GetPoint("\n指定表格插入点: "); if (ppr.Status == PromptStatus.OK) { table.Position = ppr.Value; btr.AppendEntity(table); tr.AddNewlyCreatedDBObject(table, true); tr.Commit(); } } } } }“Add”方法没有采用 2 个参数的重载
最新发布
08-10
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值