目录

1.声明一个类,并实现IList接口。

2.实现IList接口的属性

3.实现IList接口的方法

4.实现IList接口的索引器。

5.主程序设计

6.完整的实例

7.迭代器接口设计实例


        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对象,并输出列表中的每个元素。如上例主程序设计的那样。

02-17 02:21