转载——用C#学数据结构(2)
线性表
线性表是最简单、最基本、最常用的数据结构。
List类和ArrayList类
List<T> 类表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。List 类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList 泛型接口。
List类的属性和方法
|
成员 |
说明 |
|
Capacity |
获取或设置该内部数据结构在不调整大小的情况下能够保存的元素总数 |
|
Count |
获取List中实际包含的元素数 |
|
Item |
获取或设置指定索引处的元素 |
|
Add |
将对象添加到List的结尾处 |
|
AddRange |
将指定集合的元素添加到List的末尾 |
|
BinarySearch |
使用对分检索算法在已排序的List或它的一部分中查找特定元素 |
|
Clear |
从List中移除所有元素 |
|
Contains |
确定某元素是否在List中 |
|
CopyTo |
将List或它的一部分复制到一个数组中 |
|
IndexOf |
返回List或它的一部分中某个值的第一个匹配项的从零开始的索引 |
|
Insert |
将元素插入List的指定索引处 |
|
InsertRange |
将集合中的某个元素插入List的指定索引处 |
|
LastIndexOf |
返回List或它的一部分中某个值的最后一个匹配项的从零开始的索引 |
|
Remove |
从List中移除特定对象的第一个匹配项 |
|
RemoveAll |
移除与指定的谓词所定义的条件相匹配的所有元素 |
|
RemoveAt |
移除List的指定索引处的元素 |
|
RemoveRange |
从List中移除一定范围的元素 |
|
Reverse |
将List或它的一部分中元素的顺序反转 |
|
Sort |
对List或它的一部分中的元素进行排序 |
|
ToArray |
将List的元素复制到新数组中 |
根据MSDN,在决定使用List还是使用ArrayList类(两者具有类似的功能)时,记住List类在大多数情况下执行得更好并且是类型安全的。如果对List类的类型T使用引用类型,则两个类的行为是完全相同的。但是,如果对类型T使用值类型,则需要考虑实现和装箱问题。
如果对类型T使用值类型,则编译器将特别针对该值类型生成List类的实现。这意味着不必对List对象的列表元素进行装箱就可以使用该元素,并且在创建大约500个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。使用List类的特定类型的实现,而不是使用ArrayList类或自己编写强类型包装集合,这样是很有好处的。
应用实例:有数据类型为整型的顺序表La和Lb,其数据元素均按从小到大的升序排列,编写一个算法将它们合并成一个表Lc,要求Lc中数据元素也按升序排列。
using System;
using System.Collections.Generic;
namespace DataStruct
{
class Program
{
static void Main(string[] args)
{
try
{
List<int> l1 = new List<int>(5);
List<int> l2 = new List<int>(5);
for (int i = 1; i <= 5; i++)
{
l1.Add(2 * i - 1);
l2.Add(2 * i);
}
ShowListData(l1);
ShowListData(l2);
ShowListData(Merge(l1, l2));
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Console.Read();
}
public static List<int> Merge(List<int> La, List<int> Lb)
{
List<int> Lc = new List<int>(La.Count + Lb.Count);
int i,j,k;
i = j = k = 0;
while ((i < La.Count) && (j < Lb.Count))
{
if (La[i] < Lb[j])
Lc.Add(La[i++]);
else
Lc.Add(Lb[j++]);
}
while (i <La.Count)
{
Lc.Add(La[i++]);
}
//b表中还有数据元素
while (j <Lb.Count)
{
Lc.Add(Lb[j++]);
}
return Lc;
}
public static void ShowListData(List<int> l)
{
foreach (int i in l)
Console.Write(i + " ");
Console.WriteLine();
}
}
}
运行结果如下:

浙公网安备 33010602011771号