目录
C#中的IList<T>接口是.NET框架中的一种通用接口,它定义了一组在运行时可以使用类型参数T的元素的集合。IList<T>接口提供了添加、删除和查找元素的方法,以及访问和操作列表中元素的索引的属性。要实现IList<T>接口,可以按照以下步骤进行:
1.声明一个类,并实现IList<T>接口。
声明一个类,并实现IList<T>接口。在类的声明中,使用: IList<T>语法来指定接口的实现。例如:
using System.Collections.Generic;
public class MyList<T> : IList<T>
{
// 实现IList<T>接口的方法和属性
}
2.实现IList<T>接口的属性
IList<T>接口有两个属性:Count和IsReadOnly。Count属性返回列表中元素的数量,IsReadOnly属性返回一个值,表示列表是否为只读。例如:
private List<T> list = new List<T>();
public int Count
{
get { return list.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
3.实现IList<T>接口的方法
IList<T>接口定义了许多方法,包括添加、删除、查找和替换元素的方法。以下是部分方法的实现示例:
public void Add(T item)
{
list.Add(item);
}
public void Clear()
{
list.Clear();
}
public bool Contains(T item)
{
return list.Contains(item);
}
public int IndexOf(T item)
{
return list.IndexOf(item);
}
public void Insert(int index, T item)
{
list.Insert(index, item);
}
public bool Remove(T item)
{
return list.Remove(item);
}
public void RemoveAt(int index)
{
list.RemoveAt(index);
}
4.实现IList<T>接口的索引器。
IList<T>接口定义了一个索引器,它允许通过索引访问列表中的元素。索引器的实现如下:
public T this[int index]
{
get
{
return list[index];
}
set
{
list[index] = value;
}
}
5.主程序设计
在类的构造函数中,可以初始化列表,并添加一些示例数据。例如:
public MyList()
{
// 初始化列表,并添加一些示例数据
list.Add(1);
list.Add("Hello");
list.Add(3.14);
}
完成以上步骤后,就可以创建一个实现了IList<T>接口的类。这个类可以在其他代码中作为列表使用,例如:
MyList<int> myList = new MyList<int>();
myList.Add(4);
myList[1] = 2;
6.完整的实例
以下是一个实现了IList<T>接口的完整示例。在这个示例中,将创建一个名为MyList<T>的类,该类实现了IList<T>接口,并使用整数类型作为示例:
// IList<T>接口设计完整例子
using System.Collections;
namespace _121_1
{
public class MyList<T> : IList<T>
{
private readonly List<T> list = [];
public int Count
{
get { return list.Count; }
}
public bool IsReadOnly
{
get { return false; }
}
public void Add(T item)
{
list.Add(item);
}
public void Clear()
{
list.Clear();
}
public bool Contains(T item)
{
return list.Contains(item);
}
public int IndexOf(T item)
{
return list.IndexOf(item);
}
public void Insert(int index, T item)
{
list.Insert(index, item);
}
public bool Remove(T item)
{
return list.Remove(item);
}
public void RemoveAt(int index)
{
list.RemoveAt(index);
}
public void CopyTo(T[] array, int arrayIndex)
{
throw new NotImplementedException();
}
//一个类必须实现它派生的接口的所有成员,否则将被声明abstract
//注释部分是错误的迭代器设计,不能不设计,注释后警告CS0535
//public IEnumerator<T> GetEnumerator()
//{
// throw new NotImplementedException();
//}
//IEnumerator IEnumerable.GetEnumerator()
//{
// throw new NotImplementedException();
//}
/// <summary>
/// 最重要的迭代器接口设计
/// </summary>
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < list.Count; i++)
{
yield return list[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public T this[int index]
{
get
{
return list[index];
}
set
{
list[index] = value;
}
}
/// <summary>
/// list.Add(1),警告警告CS1503无法将int转为T
/// 必须经如下换后
/// </summary>
public MyList()
{
// 初始化列表,并添加一些示例数据
list.Add((T)(object)1); // 将1强制转换为T类型
list.Add((T)(object)2); // 将2强制转换为T类型
list.Add((T)(object)3); // 将3强制转换为T类型
}
}
class Program
{
static void Main(string[] args)
{
ArgumentNullException.ThrowIfNull(args);
MyList<int> myList = [];
Console.WriteLine("初始列表: {0}", string.Join(", ", myList));
myList.Add(4);
Console.WriteLine("添加元素4后的列表: {0}", string.Join(", ", myList));
myList[1] = 8;
Console.WriteLine("将索引1处的元素替换为2后的列表: {0}", string.Join(", ", myList));
Console.ReadKey();
}
}
}
// 运行结果:
/*
初始列表: 1, 2, 3
添加元素4后的列表: 1, 2, 3, 4
将索引1处的元素替换为2后的列表: 1, 8, 3, 4
*/
7.继承接口的迭代器设计一般步骤
迭代器由两部分组成:
public IEnumerator<T> GetEnumerator()
{
//
}
和
IEnumerator IEnumerable.GetEnumerator()
{
//
}
要实现这个方法,需要创建一个枚举器类,该类实现IEnumerator<T>接口,并使用IEnumerator<T>接口定义的Current属性和MoveNext()方法。以下是一个简单的示例:
// 迭代器设计,一般方法
using System.Collections;
namespace _121_2
{
internal class Program
{
private static void Main(string[] args)
{
ArgumentNullException.ThrowIfNull(args);
List<int> list = [1, 2, 3, 4, 5];
MyEnumerable<int> myEnumerable1 = new(list);
MyEnumerable<int> myEnumerable = myEnumerable1;
foreach (int item in myEnumerable)
{
Console.WriteLine(item);
}
}
}
/// <summary>
/// 迭代器设计
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="list"></param>
public class MyEnumerable<T>(List<T> list) : IEnumerable<T>
{
private readonly List<T> _list = list;
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < _list.Count; i++)
{
yield return _list[i];
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
//运行结果:
/*
1
2
3
4
5
*/
在这个示例中,MyEnumerable类实现了IEnumerable<T>接口,并定义了一个GetEnumerator()方法,该方法返回一个枚举器对象。枚举器对象使用yield关键字返回列表中的每个元素。还有一个非泛型的GetEnumerator()方法,它调用泛型版本的GetEnumerator()方法,以满足IEnumerable接口的要求。
要使用这个类,可以创建一个MyEnumerable<T>对象,并传递一个List<T>对象。再使用foreach循环遍历MyEnumerable对象,并输出列表中的每个元素。如上例主程序设计的那样。