集合类(这里指IEnumerable层次结构)实现的接口层次结构
16.1.1 IList<T>与IDictionary<TKey,TValue>
列表“键”总是一个整数,“键集”总是从0开始的非负整数的一个连续集合。
解决数据存储或数据获取问题时,考虑 IList<T> (侧重位置索引获取值)与 IDictionary<TKey,TValue> (侧重通过键来获取值)。
16.1.2 ICompatable<T>
例如, List<T>.Sort() ,你需要采取某种方式比较对象,一个办法就是使用 ICompatable<T> 接口。该接口有一个 CompareTo() 方法,返回一个整数,指出传递元素是大于、小于还是等于当前元素,所以,键的数据类型必须实现 ICompatable<T> 。
高级主题:用IComparer<T>排序
为了实现自定义排序,另一个方法是向排序方法传递实现了 IComparer<T> 的元素。集合中的元素通常不支持这个接口。
IComparable<T> 和 IComparer<T> 的区别很细微,但重要。
IComparable<T> 说:“我知道如何将自己和我的类型的另一个实例进行比较”
IComparer<T> 说:“我知道如何比较给定类型的两个实例”
public static void Main()
{
Contact aaa = new Contact() { LastName = "bbb", FirstName = "ddd" };
Contact bbb = new Contact() { LastName = "aaa", FirstName = "ccc" };
List<Contact> contactlist = new List<Contact>();
contactlist.Add(aaa);
contactlist.Add(bbb);
foreach (var contact in contactlist)
{
Console.WriteLine(contact.LastName + " ");
}
contactlist.Sort(new NameComparison());
foreach (var contact in contactlist)
{
Console.WriteLine(contact.LastName + " ");
}
Console.Read();
}
class Contact
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
class NameComparison : IComparer<Contact>
{
public int Compare(Contact x, Contact y)
{
int result;
if (Contact.ReferenceEquals(x, y))
{
result = 0;
}
else
{
if (x == null)
{
result = 1;
}
else if (y == null)
{
result = -1;
}
else
{
result = StringCompare(x.LastName, y.LastName);
if (result == 0)
{
result =
StringCompare(x.FirstName, y.FirstName);
}
}
}
return result;
}
private static int StringCompare(string x, string y)
{
int result;
if (x == null)
{
if (y == null)
{
result = 0;
}
else
{
result = 1;
}
}
else
{
result = x.CompareTo(y);
}
return result;
}
}
共有5类关键的集合类,所有泛型类都位于 System.Collections.Generic命名空间。
16.2.1 列表集合:List<T>
List<T>具有与数组相似的属性。关键在于会自动的扩展,也可以显示调用 TrimToSize() 或 Capacity 来缩小。
List<string> list = new List<string>();
list.Add("Sneezy");
list.Add("Happy");
list.Add("Dopey");
list.Add("Doc");
list.Add("Sleepy");
list.Add("Bashful");
list.Add("Grumpy");
list.Sort();
Console.WriteLine(
"In alphabetical order {0} is the "
+ "first dwarf while {1} is the last.",
list[0], list[6]);
list.Remove("Grumpy");
16.2.3 搜索List<T>
要在 List<T> 查找特定的元素,可以使用 Contains() 、 IndexOf() 、 LastIndexOf() 和 BinarySerch() 方法。
BinarySerch() 采用的是快得多的二分搜索算法,但要求元素已经排序好。一个有用的功能是假如元素没找到,会返回一个负整数。该值的按位取反(~)结果是”大于被查找元素的下一个元素“的索引,如果没有更大的值,则是元素的总数。这样就可以在特定位置方便插入新值。
List<string> list = new List<string>();
int search;
list.Add("public");
list.Add("protected");
list.Add("private");
list.Sort();
search = list.BinarySearch("protected internal");
if (search < 0)
{
list.Insert(~search, "protected internal");
}
foreach (string accessModifier in list)
{
Console.WriteLine(accessModifier);
}
|
请发表评论