IEnumerable
接口是什么?
IEnumerable
是C#编程语言中基于集合的迭代的核心接口。该接口是一个泛型接口,定义了获取可枚举集合的枚举器的方法,通过枚举器可以对集合进行迭代操作。
IEnumerable
的工作原理如何?
IEnumerable
接口是基于迭代器设计的。在调用IEnumerable
接口中的GetEnumerator()
方法时,它将返回一个实现了IEnumerator
接口的对象,这个对象可以用于迭代集合。通过不断调用IEnumerator
接口中的MoveNext()
方法,可以让枚举器向前一个一个地迭代集合中的元素。每迭代一次,就会返回一个新的元素,当到达集合的末尾时,MoveNext()
方法将返回false
,则我们就可以停止迭代。
- 如何实现
IEnumerable
接口?
在C#中使用yield
关键字可以很方便地实现IEnumerable
接口,只需要在方法中用yield
关键字来定义每个的元素,就能够返回一个带有枚举器的序列了。
public class MyCollection<T> : IEnumerable<T>
{
private List<T> collection = new List<T>();
// 实现IEnumerator接口
public IEnumerator<T> GetEnumerator()
{
for (int i = 0; i < collection.Count; i++)
{
yield return collection[i];
}
}
// 添加元素到集合中
public void Add(T item)
{
collection.Add(item);
}
}
在上面的代码中,我们定义了一个MyCollection
类,并实现了IEnumerable<T>
接口。我们通过迭代List
集合来实现GetEnumerator
方法:在每一步中,我们将元素的值返回给迭代器,然后我们对计数器i
进行自加操作。在调用该方法时,它返回的是一个包含三个整数1, 2, 3
的序列。
MyCollection<int> myCollection = new MyCollection<int>();
myCollection.Add(1);
myCollection.Add(2);
myCollection.Add(3);
foreach (int num in myCollection)
{
Console.WriteLine(num);
}
输出结果:
1
2
3
我们使用MyCollection
类对象myCollection
进行foreach循环遍历。我的实现将输出集合中的每个整数,即1,2,3
。
IEnumerable
的一个应用示例
假设有一个需要对某个数据集合进行排序的问题,我们希望用冒泡算法实现,但数据集合没有实现IEnumerable
接口,需要对其进行改进。
public class Data
{
public int Value { get; set; }
}
在上面的代码中,我们创建了一个名为 Data
的类。该类包含具有单个整数属性的对象。
public class DataCollection
{
private readonly List<Data> dataCollection = new List<Data>();
public void AddData(Data dataValue)
{
dataCollection.Add(dataValue);
}
}
我们在上面的代码中创建了一个名为DataCollection单独的类。DataCollection
的工作是包含 Data
的一个集合,并为我们提供一些操作集合的方法,如添加一个数据集 AddData()
。
现在,我们需要对 DataCollection
对象执行冒泡排序。对于 IList 对象,我们可以执行以下操作:
public static void BubbleSort(IList<Data> dataCollection)
{
for (int x = 0; x < dataCollection.Count; x++)
{
for (int y = 0; y < dataCollection.Count - 1; y++)
{
if (dataCollection[y].Value > dataCollection[y + 1].Value)
{
Data temp = dataCollection[y];
dataCollection[y] = dataCollection[y + 1];
dataCollection[y + 1] = temp;
}
}
}
}
在上面的代码中,我们使用冒泡排序算法实现,通过IList
接口来操作DataCollection
集合。
现在我们需要做的是将DataCollection
集合实现IEnumerable
接口,这样我们就可以使用foreach循环语句对其进行迭代了。
public class DataCollection : IEnumerable<Data>
{
private readonly List<Data> dataCollection = new List<Data>();
public IEnumerator<Data> GetEnumerator()
{
return dataCollection.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public void AddData(Data dataValue)
{
dataCollection.Add(dataValue);
}
}
在上面的代码中,我们实现了IEnumerable<Data>
接口,并重写了GetEnumerator()
方法。
DataCollection dataCollection = new DataCollection();
dataCollection.AddData(new Data() { Value = 15 });
dataCollection.AddData(new Data() { Value = 5 });
dataCollection.AddData(new Data() { Value = 25 });
BubbleSort(dataCollection);
foreach (Data data in dataCollection)
{
Console.WriteLine(data.Value.ToString());
}
输出结果:
5
15
25
在上面的代码中,我们在 DataCollection
对象上执行 foreach 循环,并迭代该集合的每个 Data
对象。在这个示例中,我们使用冒泡排序算法来对集合进行排序,然后以递增顺序输出每个 Data
对象的值。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中的IEnumerable接口深入研究 - Python技术站