变化多端的列表
變化多端的列表
集合大家都不陌生,但是實際應用確實有時候讓人無從下手。其比數組最大的好處就是針對多變的動態的元素降服之功能!妙哉,筆者通過《C#高級編程》集合章節發現集合也會“博大精深,變化多端”的。但是有不同于書本,那么大一本厚書,讓人敬而遠之,特別一些些一套套理論的東西更是頭大。筆者準備從集合的列表,隊列,棧,鏈表,有序表,字典,等分系列發布。盡可呢避免大篇理論(核心的還是要強調的)。然后筆者自己做一些小實例,通過自己總結描述設計思想,結合代碼實現,加以重點強調語句。最后配上運行結果!盡可能達到初學者有所悟吧。
【列表】:針對列表適合于動態創建元素。下面結合多變的創建方法,多種方法添加元素,插入元素,訪問元素的幾種方式,刪除搜索和排序。來一一揭示列表的妙處和用途!
實例描述:創建student.cs類(繼承IComparable<student>, IFormattable),包含姓名,性別,年齡屬性。帶參數的構造函數,重載ToString(實現根據條件查詢),以及自定義ToString,排序方法,IFormattable的使用
主程序:實現多方法添加,插入,刪除,查詢等
[1],創建列表,添加數據的三種形式:
方式一:對象添加法,逐一創建對象,然后在泛型列表中添加對象。
student stu1 = new student("小華", "男", 21);
student stu2 = new student("小明", "男", 22);
student stu3 = new student("小麗", "女", 19);
List<student> students = new List<student>() { stu1, stu2, stu3 };
方式二:對象添加法,逐一創建對象,然后在泛型列表中添加對象。
students.Add(new student("小花", "女", 23));
方式三:批量添加
students.AddRange(new student[]{
new student("小王", "女", 19),
new student("小白", "女", 19)
});
運行結果:
[2]泛型空間大小根據容量自動增加。即:初始為n,第一次自增2n,第二次自增4n。諸如此類,每次容量是上次2倍大小。
students.Capacity = 100;//手動設置泛型空間大小
[3]插入元素
students.Insert(2, new student("新人小王", "女", 22));
運行結果:
[4]讀取數據的幾種方法
1,object類的四個基本方法之一就是ToString,它是個虛方法,可以重載,設置自己想要的效果
//重載ToString()方法
public override string ToString()
{
return String.Format("我的名字是:{0},性別:{1},今年{2}歲!", name, sex, age);
}
2,自定義ToString(T)方法,format是T的參數
//自定義
public string ToString(string format)
{
return ToString(format, null);//如果找到該實例則根據format查找相應結果,反之為null
}
3,根據條件通過ToString(T)篩選數據
public string ToString(string format, IFormatProvider formatProvider)
{
switch (format.ToUpper())
{
case null:
case "N":
return name;
case "S":
return sex;
case "A":
return String.Format("{0},{1}年齡:{2}", name, sex, age);
default:
return String.Format("你輸入的{0}不合法!",format);
//throw new FormatException(String.Format(formatProvider, "Format{0}is not supported", format));
}
}
方法一:for循環student所有對象原則查詢
1:根據名字(N)查詢
for (int i = 0; i < students.Count; i++)
{
//1,根據自定義ToString訪問
//方法1:根據條件N查詢name
Console.WriteLine(students[i].ToString("N"));
}
運行結果:
2:根據條件A查詢全部信息
for (int i = 0; i < students.Count; i++)
{
//方法2:根據條件A查詢全部信息
Console.WriteLine(students[i].ToString("A"));
}
運行結果:
3:利用重載ToString()查詢
for (int i = 0; i < students.Count; i++)
{
//方法3:利用重載ToString()查詢
Console.WriteLine(students[i].ToString());
}
運行結果:
4利用非法條件查詢
for (int i = 0; i < students.Count; i++)
{
//方法4:利用非法條件查詢
Console.WriteLine(students[i].ToString("T"));
}
運行結果:
方法二:根據索引
?
|
|
方法三:List<T>執行接口IEnumerable,foreach迭代法
foreach (student stu in students)
{
Console.WriteLine(stu);
}
方法四:ForEach查詢:以下兩句效果一樣,第一句拉姆達查詢
?
|
|
方法三/四結果:
[5]刪除元素
students.RemoveAt(2);
運行結果:(同上圖相比較)
[6]搜索的幾種方法
根據名字搜索類,以下創建查找方法,便于下文使用。
public class FindName
{
public string name;
public FindName(string name)
{
this.name = name;
}
public bool FindNamePredicate(student stu)
{
if (stu == null)
{
throw new ArgumentNullException("stu");
//Console.WriteLine("您查詢的對象不存在!");
}
else
{
return stu.name == name;
}
}
}
三種搜索方式
//1 查詢對象索引
int index1 = students.IndexOf(stu2);
Console.WriteLine(index1);
//2 根據名字查詢
int index2 = students.FindIndex(new FindName("小白").FindNamePredicate);
Console.WriteLine(index2);
//3 拉姆達查詢
int index3 = students.FindIndex(r => r.name == "小白");
Console.WriteLine(index3);
結果:
[7]在student類中排序方法如下:
//排序
public int CompareTo(student other)
{
int compare = this.age.CompareTo(other.age);
if (compare == 0)
{
return this.name.CompareTo(other.name);
}
return compare;
}
以下四種排序方法:
//1 拉姆達方法
int s = stu2.CompareTo(stu1);
students.Sort((r1, r2) => r1.age.CompareTo(r2.age));
//升序
students.Sort();
//降序
students.Reverse();
//ForEach指定
students.ForEach(r => Console.WriteLine("{0:A}", r));
Console.WriteLine(s);
[8]本demo完整代碼:
1,兩個類的設計如下:student和FindName
View Code
public class student :IComparable<student>, IFormattable
{
//設置屬性:姓名,性別,年齡
public string name { get; set; }
public string sex { get; set; }
public int age { get; set; }
//構造自定義方法
public student(string name, string sex, int age)
{
this.name = name;
this.sex = sex;
this.age = age;
}
//重載ToString()方法
public override string ToString()
{
return String.Format("我的名字是:{0},性別:{1},今年{2}歲!", name, sex, age);
}
//自定義
public string ToString(string format)
{
return ToString(format, null);//如果找到該實例則根據format查找相應結果,反之為null
}
public string ToString(string format, IFormatProvider formatProvider)
{
switch (format.ToUpper())
{
case null:
case "N":
return name;
case "S":
return sex;
case "A":
return String.Format("{0},{1}年齡:{2}", name, sex, age);
default:
return String.Format("你輸入的{0}不合法!",format);
//throw new FormatException(String.Format(formatProvider, "Format{0}is not supported", format));
}
}
//排序
public int CompareTo(student other)
{
int compare = this.age.CompareTo(other.age);
if (compare == 0)
{
return this.name.CompareTo(other.name);
}
return compare;
}
}
public class FindName
{
public string name;
public FindName(string name)
{
this.name = name;
}
public bool FindNamePredicate(student stu)
{
if (stu == null)
{
throw new ArgumentNullException("stu");
//Console.WriteLine("您查詢的對象不存在!");
}
else
{
return stu.name == name;
}
}
}
2客戶端效果:
View Code
static void Main(string[] args)
{
try
{
//添加數據的三種形式
//方式一
student stu1 = new student("小華", "男", 21);
student stu2 = new student("小明", "男", 22);
student stu3 = new student("小麗", "女", 19);
List<student> students = new List<student>() { stu1, stu2, stu3 };
//泛型空間大小根據容量自動增加。即:初始為n,第一次自增2n,第二次自增4n。諸如此類,每次容量是上次2倍大小。
students.Capacity = 100;//手動設置泛型空間大小
//方式二
students.Add(new student("小花", "女", 23));
//方式三
students.AddRange(new student[]{
new student("小王", "女", 19),
new student("小白", "女", 19)
});
//插入元素
students.Insert(2, new student("新人小王", "女", 22));
#region for
//讀取數據的幾種方法
//for (int i = 0; i < students.Count; i++)
//{
// //1,根據自定義ToString訪問
// //方法1:根據條件N查詢name
// Console.WriteLine(students[i].ToString("N"));
// //方法2:根據條件A查詢全部信息
// Console.WriteLine(students[i].ToString("A"));
// //方法3:利用重載ToString()查詢
// Console.WriteLine(students[i].ToString());
// //方法4:利用非法條件查詢
// Console.WriteLine(students[i].ToString("T"));
// //2,根據索引
// //student s1 = student[3];
//}
#endregion
#region foreach
//3,List<T>執行接口IEnumerable,foreach迭代法
//foreach (student stu in students)
//{
// Console.WriteLine(stu);
//}
#endregion
#region ForEach
//students.ForEach(r => Console.WriteLine("{0:A}", r));
//students.ForEach(delegate(student r) { Console.WriteLine("{0:A}", r); });
#endregion
//刪除元素
// students.RemoveAt(2);
//搜索的幾種方法
//int index1 = students.IndexOf(stu2);//查詢對象索引
////int index2 = students.FindIndex(new FindName("小白").FindNamePredicate);
//int index3 = students.FindIndex(r=>r.name=="小白");
//Console.WriteLine(index3);
//排序
//int s=stu2.CompareTo(stu1);
// students.Sort((r1, r2) => r1.age.CompareTo(r2.age));
//students.Sort();
students.Reverse();
students.ForEach(r => Console.WriteLine("{0:A}", r));
//Console.WriteLine(s);
}
catch(Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadKey();
}
【結尾】:本文重點突出集合列表的用法,特別多種用法的掌握。比如一個添加數據,與其逐個對象的添加,不如分組效果好。還有查詢時,for循環性能不高而且代碼比較多。foreach就比較好理解啦,看起來也簡便。最簡便的當然拉姆達法則啦。諸如此類,可以總結很多東西。明白它的構造和使用方法。才能靈活運行!
http://www.cnblogs.com/baiboy
分類:C#
作者:Leo_wl
出處:http://www.cnblogs.com/Leo_wl/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
版權信息
總結
- 上一篇: Discuz论坛禁止匿名发贴,却出现匿名
- 下一篇: Android VLC播放器二次开发1—