程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> 關於C#泛型列表List<T>的根本用法總結

關於C#泛型列表List<T>的根本用法總結

編輯:C#入門知識

關於C#泛型列表List<T>的根本用法總結。本站提示廣大學習愛好者:(關於C#泛型列表List&lt;T&gt;的根本用法總結)文章只能為提供參考,不一定能成為您想要的結果。以下是關於C#泛型列表List&lt;T&gt;的根本用法總結正文


示例代碼以下:
namespace SampleListT
{
  class Program
  {
      static void Main(string[] args)
      {
//using System.Collections.Generic; 定名空間中的List<T>
//using System.Collections; 定名空間中的ArrayList 
//都完成了列表聚集,一個是泛形聚集,一個長短泛型的
//上面我們將Person對象加到聚集中

Person p1 = new Person( "aladdin" , 20 );
Person p2 = new Person("zhao", 10);
Person p3 = new Person("jacky", 40);

//假如不制訂list的容器年夜小,默許是0,只需有元素參加是,會主動擴大到4,假如第5個元素參加時,就釀成了8,第9個參加,就成16
//可以看出,老是成倍的增加,擴大時要從新開拓內存,如許會影響效力,假如事前曉得元素個數,或許能夠個數,最好給個盡可能年夜的衡量值
//我們參加3個元素,設容器年夜小為4.注:設為4不是指只能放4個元素,假如超越,一樣也會成倍擴大,如許做只是為了盡可能擴大帶來的開支
List<Person> list = new List<Person>(4);

list.Add(p1);
list.Add(p2);
list.Add(p3);

//本辦法是消除多於的沒有效的內存空間,例:假如開拓年夜小為100,而我們只用了4個,其他的放著,是否是很糟蹋 
//本辦法挪用時會檢討元素個數是否是占到了容器年夜小的90%以上,假如是,則不停止收受接管.
list.TrimExcess();

//ArrayList辦法與List<>用法一樣,分歧的是,它是對象聚集,參數是Object如許會有裝箱拆箱的能夠,盡可能用List<>
//本處不再做演示


// 1 初始化聚集器
// C#3.0開端,供給了初始化功效,然則並沒有反響到IL代碼中,在IL中,一樣也是把個轉化成ADD辦法來挪用
List<int> l2 = new List<int>() { 1 ,2 ,3 ,4 ,5 };


// 2 添加元素 AddRange() 本辦法可以一次性添加一批對象
List<Person> lists = new List<Person>(10);
//參數是一個必需能夠跌代的對象,也可是數組 
list.AddRange( new Person[] { new Person( "aladdin" ,20) , new Person("zhao",6)});
 

//結構傳入批量參數 ,與AddRange後果一樣
List<Person> mylist = new List<Person>(new Person[] { new Person( "aladdin" ,20) , new Person("zhao",6)});


// 3 拔出元素
// 應用Insert()辦法,可以在指定地位拔出元素
// 例 我們在1地位拔出 則最初釀成了 aladdin jacky zhao..拔出意思就是,這個位我占了,之前占這位的和他以後的,統統往後移一名
mylist.Insert( 1 , new Person( "jacky" , 88 ));

foreach (Person p in mylist)
{
    Console.WriteLine(p.name);
}


// 4 拜訪元素
// ArrayList 與 List<T>都是供給了索引器來拜訪的
Console.WriteLine( "----------------拜訪元素------------------------");

for (int i = 0; i < mylist.Count; i++)
{
    Console.WriteLine(mylist[i].name);
}
//還可使用foreach跌代器來完成,些處不再舉例

//應用Foreach辦法
//public delegate void Action<T>(T obj);例用拜托做為參數 
//些處我們用呀媽Day表達式完成
Console.WriteLine( "-----------------用ForEach辦法輸入------------------------");

mylist.ForEach( param => Console.WriteLine(param.name) ) ;


// 5刪除元素
//刪除元素可使用RemoveAt()直接傳入索引器值
//將第一個元素直接刪除
mylist.RemoveAt(0);
//也能夠將要刪除的元素傳給Remove辦法

List<Person> lists2 = new List<Person>(10);

Person per1 = new Person( "aladdin" , 100 );
Person per2 = new Person("zhao", 100);
Person per3 = new Person("jacky", 100);

lists2.Add(per1);
lists2.Add(per2);
lists2.Add(per3);

lists2.Remove(per3);

Console.WriteLine( "-------刪除後的元素---------");

foreach (Person per in lists2)
{
    Console.WriteLine(per.name);
}
//從成果可以看出 稱號為Jacky的元素被刪除
//上面說一下Remove辦法的刪除進程 
// 用IndexOf辦法肯定出對象的索引,然後按索引刪除
// 在IndexOf辦法內,起首檢討元素是否是完成了IEquatable接口,假如是,就挪用這個接口中的Equals辦法
// 假如沒有完成,則挪用Object中的Equals辦法比擬元素(也就是址址比擬)
// 以上我們刪除per3,很明顯顯一個地址,所以被刪除 

// 上面我們改裝了Person ,完成了IEquatable<Person>,在比擬辦法中,一直前往false , 則per3會比擬掉敗,不會被刪除
// 成果3個都在
// 假如要刪除對象,最好應用索引直接刪除,由於Remove辦法閱歷了一系列進程後,最初才按索引刪除!

// RemoveRange()刪除一個規模
// 第一個參數 開端地位 第二個 個數
//lists2.RemoveRange( 1 , 2 );
//Console.WriteLine( "批量刪除後----------------");

//foreach (Person per in lists2)
//{
//    Console.WriteLine(per.name);
//}


// 6 搜刮
// 搜刮有許多種方法,可使用IndexOf LastIndexOf FindIndex FindLasIndex Find FindLas ,假如只是檢查元素存不,可使用Exists()辦法
// IndexOf() 辦法 須要將一個對象做參數, 假如打到,就前往本元素在聚集中的索引,假如找不到就前往-1,IndexOf還可使用IEquatable接口來比擬元素

List<Person> ls3 = new List<Person>(10);

Person person1 = new Person("aladdin", 100);
Person person2 = new Person("zhao", 100);
Person person3 = new Person("jacky", 100);

ls3.Add(person1);
ls3.Add(person2);
ls3.Add(person3);

// 為了應用默許的地址比擬,我們把Person的接口臨時去失落
int index = ls3.IndexOf(person3);
Console.WriteLine( "per3 的索引:" + index); //2
// 還可以指定搜刮規模 從第3個開端,規模長度是1
int index2 = ls3.IndexOf(person3,2,1);
Console.WriteLine(index2);
//IEquatable比擬辦法後面曾經寫過,不再舉例

// FindIndex()辦法是用來搜刮帶有必定特征的元素
// 例用拜托做參數  public delegate bool Predicate<T>(T obj);

int index3 = ls3.FindIndex(param => param.name.Equals("jacky"));
Console.WriteLine( index3 );// 2
// FindLastIndex是從前面查第一個湧現的元素,由於我們這裡沒有反復元素,所以表現不出他只查找一個,就停上去的後果
int index4 = ls3.FindLastIndex(p => p.name.Equals("aladdin"));
Console.WriteLine(index4);
// Find辦法與FindIndex辦法用法一樣,分歧的是,它前往的是元素自己
Person ppp = ls3.Find( p => p.name.Equals("jacky")) ;
Console.WriteLine(ppp);

// 假如要查找一切的婚配元素,而不是找到第一個就停上去,就應用FindAll辦法
// 我們查找一切年事等於100的對象,3個都相符
List<Person> newList = ls3.FindAll(p => p.age == 100);

Console.WriteLine( "----------查找一切---------");

foreach (Person p in newList)
{
    Console.WriteLine(p.name);
}


// 7 排序
// List可以例用Sort辦法排序,完成算法是疾速排序
// 本辦法有好幾個重載

//public void Sort(); //只對元素完成了IComparable能力應用這個辦法 ,假如完成了則,可以直接挪用一次sort以後,就排好序了
//public void Sort(Comparison<T> comparison); //我們的Person並沒有完成誰人接口,所以要用泛型拜托當參數的辦法
//public void Sort(IComparer<T> comparer); //泛型接口當參數 public delegate int Comparison<T>(T x, T y);
//public void Sort(int index, int count, IComparer<T> comparer); //可以指定規模

List<Person> ls4 = new List<Person>(10);

Person person4 = new Person("aladdin", 100);
Person person5 = new Person("zhao", 33);
Person person6 = new Person("jacky", 44);

ls4.Add(person4);
ls4.Add(person5);
ls4.Add(person6);

ls4.Sort(MyComparFunc);
Console.WriteLine( "-------------排序後的-------------");

foreach (Person p in ls4)
{
    Console.WriteLine(p.name+ p.age );
}

Console.WriteLine( "--------倒置循序------------------");
ls4.Reverse();

foreach (Person p in ls4)
{
    Console.WriteLine(p.name+ p.age);
}


// 8 類型轉換
//可以將聚集中的元素轉換成隨意率性類型的元素,好比,我們要將聚集中的Person轉換成為Racer對象Racer只包括名字,沒豐年紀
// public List<TOutput> ConvertAll<TOutput>(Converter<T, TOutput> converter);
// public delegate TOutput Converter<TInput, TOutput>(TInput input);  拜托參數
List<Racer> ls5 = ls4.ConvertAll<Racer>((input) => new Racer(input.name)) ;

Console.WriteLine( "-----------轉換後的玩意--------");
foreach (Racer r in ls5)
{
    Console.WriteLine(r.name);
}


// 9 只讀聚集
// 在創立完聚集今後,確定是可讀寫的,假如不是,他就不克不及再添加新元素了,然則,假如是以為填充終了,不要再做修正.
// 可使用只讀聚集,應用AsReadOnly辦法() 前往ReadOnlyCollection<T>類型,它與List<>操作是一樣的,然則一但有修正聚集的操作,就會刨出異常
// 他屏障了平日的ADD等辦法

ReadOnlyCollection<Racer> persss =  ls5.AsReadOnly();

Console.WriteLine("輸入只讀聚集");

foreach (Racer r in persss)
{
    Console.WriteLine(r.name);
}

Console.ReadLine();

      }

//為了比擬寫的拜托完成辦法
public static  int MyComparFunc(Person p1, Person p2)
      {
if (p1.age == p2.age)
{
    return 0;
}
else if (p1.age > p2.age)
{
    return 1;
}
else
{
    return -1;
}
      }
  }

//two helper classes
 class Person//:IEquatable<Person>
  {
      public string name;
      public int age;

      public Person( string name , int age )
      {
         this.name= name;
this.age = age;
      }

      ////一直給一個False值
      //public bool Equals(Person other)
      //{
      //    return false;
      //}

  }

  class Racer
  {
      public string name;

      public Racer(string name)
      {
         this.name= name;
      }
  }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved