首頁 後端開發 C#.Net教程 關於C#泛型列表List的基本用法總結

關於C#泛型列表List的基本用法總結

Dec 15, 2016 pm 03:29 PM

範例程式碼如下:

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;
      }
  }
}
登入後複製


更多關於C#泛型清單List的基本用法總結相關文章請關注PHP中文網!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1423
52
Laravel 教程
1321
25
PHP教程
1269
29
C# 教程
1249
24
c#.net的持續相關性:查看當前用法 c#.net的持續相關性:查看當前用法 Apr 16, 2025 am 12:07 AM

C#.NET依然重要,因為它提供了強大的工具和庫,支持多種應用開發。 1)C#結合.NET框架,使開發高效便捷。 2)C#的類型安全和垃圾回收機制增強了其優勢。 3).NET提供跨平台運行環境和豐富的API,提升了開發靈活性。

從網絡到桌面:C#.NET的多功能性 從網絡到桌面:C#.NET的多功能性 Apr 15, 2025 am 12:07 AM

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#作為多功能.NET語言:應用程序和示例 C#作為多功能.NET語言:應用程序和示例 Apr 26, 2025 am 12:26 AM

C#在企業級應用、遊戲開發、移動應用和Web開發中均有廣泛應用。 1)在企業級應用中,C#常用於ASP.NETCore開發WebAPI。 2)在遊戲開發中,C#與Unity引擎結合,實現角色控制等功能。 3)C#支持多態性和異步編程,提高代碼靈活性和應用性能。

c#.net適合您嗎?評估其適用性 c#.net適合您嗎?評估其適用性 Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

.NET中的C#代碼:探索編程過程 .NET中的C#代碼:探索編程過程 Apr 12, 2025 am 12:02 AM

C#在.NET中的編程過程包括以下步驟:1)編寫C#代碼,2)編譯為中間語言(IL),3)由.NET運行時(CLR)執行。 C#在.NET中的優勢在於其現代化語法、強大的類型系統和與.NET框架的緊密集成,適用於從桌面應用到Web服務的各種開發場景。

將C#.NET應用程序部署到Azure/AWS:逐步指南 將C#.NET應用程序部署到Azure/AWS:逐步指南 Apr 23, 2025 am 12:06 AM

如何將C#.NET應用部署到Azure或AWS?答案是使用AzureAppService和AWSElasticBeanstalk。 1.在Azure上,使用AzureAppService和AzurePipelines自動化部署。 2.在AWS上,使用AmazonElasticBeanstalk和AWSLambda實現部署和無服務器計算。

C#.NET與未來:適應新技術 C#.NET與未來:適應新技術 Apr 14, 2025 am 12:06 AM

C#和.NET通過不斷的更新和優化,適應了新興技術的需求。 1)C#9.0和.NET5引入了記錄類型和性能優化。 2).NETCore增強了雲原生和容器化支持。 3)ASP.NETCore與現代Web技術集成。 4)ML.NET支持機器學習和人工智能。 5)異步編程和最佳實踐提升了性能。

C#和.NET運行時:它們如何一起工作 C#和.NET運行時:它們如何一起工作 Apr 19, 2025 am 12:04 AM

C#和.NET運行時緊密合作,賦予開發者高效、強大且跨平台的開發能力。 1)C#是一種類型安全且面向對象的編程語言,旨在與.NET框架無縫集成。 2).NET運行時管理C#代碼的執行,提供垃圾回收、類型安全等服務,確保高效和跨平台運行。

See all articles