C#中List<>怎样作为形参在方法中使用

如题所述

表示可通过索引访问的对象的强类型列表。提供用于对列表进行搜索、排序和操作的方法。
List<(Of <(T>)>) 类是 ArrayList 类的泛型等效类。该类使用大小可按需动态增加的数组实现 IList<(Of <(T>)>) 泛型接口。

List<(Of <(T>)>) 类既使用相等比较器又使用排序比较器。

诸如 Contains、IndexOf、LastIndexOf 和 Remove 这样的方法对列表元素使用相等比较器。类型 T 的默认相等比较器按如下方式确定。如果类型 T 实现 IEquatable<(Of <(T>)>) 泛型接口,则相等比较器为该接口的 Equals(T) 方法;否则,默认相等比较器为 Object..::.Equals(Object)。

诸如 BinarySearch 和 Sort 这样的方法对列表元素使用排序比较器。类型 T 的默认比较器按如下方式确定。如果类型 T 实现 IComparable<(Of <(T>)>) 泛型接口,则默认比较器为该接口的 CompareTo(T) 方法;否则,如果类型 T 实现非泛型 IComparable 接口,则默认比较器为该接口的 CompareTo(Object) 方法。如果类型 T 没有实现其中任一个接口,则不存在默认比较器,并且必须显式提供比较器或比较委托。

List<(Of <(T>)>) 不保证是排序的。在执行要求 List<(Of <(T>)>) 已排序的操作(例如 BinarySearch)之前,您必须对 List<(Of <(T>)>) 进行排序。

可使用一个整数索引访问此集合中的元素。此集合中的索引从零开始。

List<(Of <(T>)>) 接受 nullNothingnullptrnull 引用(在 Visual Basic 中为 Nothing) 作为引用类型的有效值并且允许有重复的元素。

性能注意事项
在决定使用 List<(Of <(T>)>) 还是使用 ArrayList 类(两者具有类似的功能)时,记住 List<(Of <(T>)>) 类在大多数情况下执行得更好并且是类型安全的。如果对 List<(Of <(T>)>) 类的类型 T 使用引用类型,则两个类的行为是完全相同的。但是,如果对类型 T 使用值类型,则需要考虑实现和装箱问题。

如果对类型 T 使用值类型,则编译器将特别针对该值类型生成 List<(Of <(T>)>) 类的实现。这意味着不必对 List<(Of <(T>)>) 对象的列表元素进行装箱就可以使用该元素,并且在创建大约 500 个列表元素之后,不对列表元素装箱所节省的内存将大于生成该类实现所使用的内存。

确保用于类型 T 的值类型实现 IEquatable<(Of <(T>)>) 泛型接口。如果未实现,则诸如 Contains 这样的方法必须调用 Object..::.Equals(Object) 方法,后者对受影响的列表元素进行装箱。如果值类型实现 IComparable 接口,并且您拥有源代码,则还应实现 IComparable<(Of <(T>)>) 泛型接口以防止 BinarySearch 和 Sort 方法对列表元素进行装箱。如果您不拥有源代码,则将一个 IComparer<(Of <(T>)>) 对象传递给 BinarySearch 和 Sort 方法。

使用 List<(Of <(T>)>) 类的特定于类型的实现,而不是使用 ArrayList 类或自己编写强类型包装集合,这样是很有好处的。原因是您的实现必须做 .NET Framework 已经为您完成的工作,并且公共语言运行时能够共享 Microsoft 中间语言代码和元素据,这是您的实现所无法做到的。

示例
下面的代码示例演示 List<(Of <(T>)>) 泛型类的几个属性和方法。该代码示例使用默认构造函数创建具有默认容量的字符串列表。随后显示 Capacity 属性,然后使用 Add 方法添加若干项。添加的项被列出,Capacity 属性会同 Count 属性一起再次显示,指示已根据需要增加了容量。

该示例使用 Contains 方法测试该列表中是否存在某个项,使用 Insert 方法在列表的中间插入一个新项,然后再次显示列表的内容。

默认的 Item 属性(C# 中的索引器)用于检索项,Remove 方法用于移除前面添加的重复项的第一个实例,然后,该示例再次显示内容。Remove 方法总是移除它所遇到的第一个实例。

该示例使用 TrimExcess 方法减小容量以匹配计数,然后显示 Capacity 和 Count 属性。如果未用容量已经小于总容量的 10%,则列表容量不会进行调整。

最后,代码示例使用 Clear 方法移除列表中的所有项,并显示 Capacity 和 Count 属性。

Visual Basic 复制代码
Imports System
Imports System.Collections.Generic

Public Class Example

Public Shared Sub Main()

Dim dinosaurs As New List(Of String)

Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)

dinosaurs.Add("Tyrannosaurus")
dinosaurs.Add("Amargasaurus")
dinosaurs.Add("Mamenchisaurus")
dinosaurs.Add("Deinonychus")
dinosaurs.Add("Compsognathus")

Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next

Console.WriteLine(vbLf & "Capacity: {0}", dinosaurs.Capacity)
Console.WriteLine("Count: {0}", dinosaurs.Count)

Console.WriteLine(vbLf & "Contains(""Deinonychus""): {0}", _
dinosaurs.Contains("Deinonychus"))

Console.WriteLine(vbLf & "Insert(2, ""Compsognathus"")")
dinosaurs.Insert(2, "Compsognathus")

Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next

Console.WriteLine(vbLf & "dinosaurs(3): {0}", dinosaurs(3))

Console.WriteLine(vbLf & "Remove(""Compsognathus"")")
dinosaurs.Remove("Compsognathus")

Console.WriteLine()
For Each dinosaur As String In dinosaurs
Console.WriteLine(dinosaur)
Next

dinosaurs.TrimExcess()
Console.WriteLine(vbLf & "TrimExcess()")
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
Console.WriteLine("Count: {0}", dinosaurs.Count)

dinosaurs.Clear()
Console.WriteLine(vbLf & "Clear()")
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity)
Console.WriteLine("Count: {0}", dinosaurs.Count)
End Sub
End Class

' This code example produces the following output:
'
'Capacity: 0
'
'Tyrannosaurus
'Amargasaurus
'Mamenchisaurus
'Deinonychus
'Compsognathus
'
'Capacity: 8
'Count: 5
'
'Contains("Deinonychus"): True
'
'Insert(2, "Compsognathus")
'
'Tyrannosaurus
'Amargasaurus
'Compsognathus
'Mamenchisaurus
'Deinonychus
'Compsognathus
'
'dinosaurs(3): Mamenchisaurus
'
'Remove("Compsognathus")
'
'Tyrannosaurus
'Amargasaurus
'Mamenchisaurus
'Deinonychus
'Compsognathus
'
'TrimExcess()
'Capacity: 5
'Count: 5
'
'Clear()
'Capacity: 5
'Count: 0

C# 复制代码
using System;
using System.Collections.Generic;

public class Example
{
public static void Main()
{
List<string> dinosaurs = new List<string>();

Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);

dinosaurs.Add("Tyrannosaurus");
dinosaurs.Add("Amargasaurus");
dinosaurs.Add("Mamenchisaurus");
dinosaurs.Add("Deinonychus");
dinosaurs.Add("Compsognathus");

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

Console.WriteLine("\nCapacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);

Console.WriteLine("\nContains(\"Deinonychus\"): {0}",
dinosaurs.Contains("Deinonychus"));

Console.WriteLine("\nInsert(2, \"Compsognathus\")");
dinosaurs.Insert(2, "Compsognathus");

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

Console.WriteLine("\ndinosaurs[3]: {0}", dinosaurs[3]);

Console.WriteLine("\nRemove(\"Compsognathus\")");
dinosaurs.Remove("Compsognathus");

Console.WriteLine();
foreach(string dinosaur in dinosaurs)
{
Console.WriteLine(dinosaur);
}

dinosaurs.TrimExcess();
Console.WriteLine("\nTrimExcess()");
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);

dinosaurs.Clear();
Console.WriteLine("\nClear()");
Console.WriteLine("Capacity: {0}", dinosaurs.Capacity);
Console.WriteLine("Count: {0}", dinosaurs.Count);
}
}

/* This code example produces the following output:

Capacity: 0

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

Capacity: 8
Count: 5

Contains("Deinonychus"): True

Insert(2, "Compsognathus")

Tyrannosaurus
Amargasaurus
Compsognathus
Mamenchisaurus
Deinonychus
Compsognathus

dinosaurs[3]: Mamenchisaurus

Remove("Compsognathus")

Tyrannosaurus
Amargasaurus
Mamenchisaurus
Deinonychus
Compsognathus

TrimExcess()
Capacity: 5
Count: 5

Clear()
Capacity: 5
Count: 0
*/
希望对你有用
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-19
func<T>(List<T> Ps)
{
}
第2个回答  2011-11-18
直接用
private void Fun(List<A> a)
{}
多种类型泛型集合的话,也可以先封装再传递
class Col{
List<a> a;
List<b> b;
...}
private void Fun( Col col)
{
...
}
我是酱紫实现的。o(∩_∩)o 哈哈本回答被网友采纳

C#中List<>怎样作为形参在方法中使用
List<(Of <(T>)>) 接受 nullNothingnullptrnull 引用(在 Visual Basic 中为Nothing) 作为引用类型的有效值并且允许有重复的元素。 性能注意事项在决定使用 List<(Of <(T>)>) 还是使用 ArrayList 类(两者具有类似的功能)时,记住 List<(Of <(T>)>) 类在大多数情况下执行得更好并且是类型安全的。如果对 ...

c#方法的参数类型主要有哪三种类型?
"); <\/SPAN> MyClass mc = new MyClass(); <\/SPAN>mc.ChangeValue(value); Response.Write(value); 效果:C#参数类型(2):引用参数使用ref关键字可以使参数按照引用传递.在需要传递回调用方法时,在方法中对参数所做的任何更改都将反映在该变量中,若使用ref关键字,则在方法定义和调用方法...

c# 中调用方法能调用方法中的变量值吗?举个例子
形参自然不会改变参数的值。如果要改变值类型的参数,如int类型,string类型等基本类型,则用ref引用。如 fun_add(ref int index),则对index参数的修改,也会修改调用时传入的参数的值。另外如果是 引用类型,如定义个类book,然后以book类的实例b1为参数,那在调用的方法里面f(book bk) 对bk的...

c#反射List<T>获取T
有点要注意,在获取第一个泛型的形参类型那里,不用的类型继承的泛型接口也不同,例如,可能是IList、IList<T>、Dictionary<T,K>的,所以不一定是第一个泛型就可以获取出T。这里应该还是有根据实际情况做相应处理的过程。另外,如果已知是List的话,有一个很简单的方法:xx.GetType().GetMethod("Fin...

在C#中什么是形参、什么是实参?
其他语言都是一样的吧 main(){ int a=1;fun(a); \/\/ 这里的a ,传到fun函数里,在这里,这个a 是实参 } fun( int b){ b=b+1; \/\/这里的b ,是函数里面定义的,是形式参数,它接受调用时实参的值。}

c#传递引用对象作为参数的时候就没有必要用ref关键字,对吗
不添加ref关键字时,作为方法参数的形参与实际传入的实参实际上是两个对象,在栈中有两个地方分别保存它们的名字,假设形参叫A,实参叫B。只是引用对象保存的本来就是地址,所以这两个对象的值“恰好”指向堆中的同一个地方,假设这个地方叫C,对这两个对象的值进行修改实际上是修改C,所以都会影响到...

C#数列变量在方法中改变后原值是否改变
你说的数列是数组吧?数组是类,是引用类型,因此把数组做参数的话,方法内的元素改变会影响外部,但如果在方法内部写数组名 = new 数组,那就不会影响外面了,因为从外面传进来的是一个引用地址的复制。

C#中形参和实参有什么区别和联系?
2.实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。 3.实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。 4.函数调用中发生...

什么是范型算法?
一旦声明了范型,你就可以使用它。在上面的例子中使用了List<String>。这里使用String是实参,代替了形参E。如果使用List<Integer>,则用实参Integer代替了形参E。不管List<Integer>还是List<String>,它们的类只有一个。考虑下面的代码:List<java\/lang\/String.java.html" target="_blank">String> list1...

C#中方法参数传递机制
一、参数的使用方法:1、值参数(Value Parameter )格式:方法名称(参数类型 参数名称[,参数类型 参数名称])2、引用参数(Reference Parameter )格式:方法名称(ref 参数类型 参数名称[,ref 参数类型 参数名称])3、输出参数(Out Parameter)格式:方法名称(out 参数类型 参数名称[,out 参数类型 参数...

相似回答