IEnumerable Và IEnumerator Trong C#

Chúng tôi vui mừng chia sẻ kiến thức về từ khóa Ienumerable la gi để tối ưu hóa nội dung trang web và chiến dịch tiếp thị trực tuyến. Bài viết cung cấp phương pháp tìm kiếm, phân tích và lựa chọn từ khóa phù hợp, cùng với chiến lược và công cụ hữu ích. Hy vọng thông tin này sẽ giúp bạn xây dựng chiến lược thành công và thu hút lưu lượng người dùng. Cảm ơn sự quan tâm và hãy tiếp tục theo dõi blog để cập nhật kiến thức mới nhất.

Là 2 interface được khái niệm sẵn trong namespace System.Collections của .NET. Vậy IEnumerable và IEnumerator là gì và có tác dụng như nào? Tất cả chúng ta sẽ cùng tìm hiểu kỹ hơn trong nội dung bài viết này nhé.

Bạn Đang Xem: IEnumerable Và IEnumerator Trong C#

Trong nội dung bài viết này mình sẽ sử dụng list các số nguyên để làm ví dụ như sau:

Listvàlt;intvàgt; listInt = new Listvàlt;intvàgt; { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

IEnumerable là gì và dùng thế nào?

Bất luận ai khi sử dụng C# để lập trình thường xuyên phải thực hiện duyệt một list từ thành phần đầu tới thành phần cuối như đoạn code trong tương lai:

var count = listInt.Count; for (var i = 0; i < count; i++) { var item = listInt[i]; Console.WriteLine(“{0}”, item); }

Hoặc

foreach (var item in listInt) { Console.WriteLine(“{0}”, item); }

Với cách trước nhất, đây là phương pháp duyệt list kinh điển mà bất kì tiếng nói lập trình nào thì cũng sử dụng. Tất cả chúng ta sẽ không còn bàn tới phương pháp này.Với cách thứ hai, rất nhiều tiếng nói lập trình tân tiến đều tương trợ. Và C# cũng không phải là một ngoại lệ. Vậy làm thế nào để C# có thể thực hiện duyệt list sử dụng foreach? Lời giải đáp là đối tượng người sử dụng đó implement interface IEnumerable hoặc IEnumerablevàlt;Tvàgt; (tương trợ kiểu generic). Tất cả chúng ta hãy xem khái niệm của 2 interface trên như sau:

public interface IEnumerable { IEnumerator GetEnumerator(); }

Xem Thêm : Flow meter là gì? Các loại và ứng dụng thực tế của chúng

Kiểu generic sẽ là:

public interface IEnumerablevàlt;out Tvàgt; : IEnumerable { IEnumeratorvàlt;Tvàgt; GetEnumerator(); }

Trong C# có rất nhiều kiểu list như Dictionary, List, ArrayList, HashSet.. và ngay kiểu tài liệu string đều implement từ IEnumerable hoặc IEnumerablevàlt;Tvàgt;.

public class Dictionaryvàlt;TKey, TValuevàgt; : IDictionaryvàlt;TKey, TValuevàgt;, ICollectionvàlt;KeyValuePairvàlt;TKey, TValuevàgt;>, IEnumerablevàlt;KeyValuePairvàlt;TKey, TValuevàgt;>, IEnumerable, IDictionary, ICollection, IReadOnlyDictionaryvàlt;TKey, TValuevàgt;, IReadOnlyCollectionvàlt;KeyValuePairvàlt;TKey, TValuevàgt;>, ISerializable, IDeserializationCallback { //… } public class Listvàlt;Tvàgt; : IListvàlt;Tvàgt;, ICollectionvàlt;Tvàgt;, IEnumerablevàlt;Tvàgt;, IEnumerable, IList, ICollection, IReadOnlyListvàlt;Tvàgt;, IReadOnlyCollectionvàlt;Tvàgt; { //… } public class ArrayList : IList, ICollection, IEnumerable, ICloneable { //… } public class HashSetvàlt;Tvàgt; : ICollectionvàlt;Tvàgt;, IEnumerablevàlt;Tvàgt;, IEnumerable, ISerializable, IDeserializationCallback, ISetvàlt;Tvàgt;, IReadOnlyCollectionvàlt;Tvàgt; { //… } public sealed class String : IComparable, ICloneable, IConvertible, IEnumerable, IComparablevàlt;Stringvàgt;, IEnumerablevàlt;charvàgt;, IEquatablevàlt;Stringvàgt; { //… }

Vậy IEnumerable giúp một đối tượng người sử dụng có thể thực hiện duyệt các thành phần bằng foreach. Tất cả chúng ta hãy xem ví dụ trong tương lai:

public class MyIntergerCollection : IEnumerable { private readonly int[] _listInt; public MyIntergerCollection(int[] listInt) { _listInt = listInt; } public IEnumerator GetEnumerator() { return _listInt.GetEnumerator(); } }

Và khi thực hiện duyệt các thành phần từ trên đầu đến cuối như sau:

var customMyCollection = new MyIntergerCollection(listInt.ToArray()); foreach (var item in customMyCollection) { Console.WriteLine(item); }

Kết quả các bạn sẽ thấy như bạn thực hiện for hoặc foreach thường ngày:

1 2 3 4 5 6 7 8 9 10

Vậy IEnumerator là gì và có tác dụng như nào?

Tất cả chúng ta hãy lưu ý đến khái niệm của IEnumerable có hàm GetEnumerator() trả về là một đối tượng người sử dụng được implement từ interface IEnumerator và tất cả chúng ta hãy xem khái niệm của interface này:

Xem Thêm : HR Generalist là gì? Chức năng và nhiệm vụ ra sao?

public interface IEnumerator { object Current { get; } bool MoveNext(); void Reset(); } public interface IEnumeratorvàlt;out Tvàgt; : IDisposable, IEnumerator { T Current { get; } }

Trong số đó:Tính chất Current: trả về thành phần ngày nay của list đang duyệt.Hàm MoveNext(): trả về true nếu có thể duyệt đến thành phần tiếp theo, trái lại trả về false.Hàm Reset(): thực hiện thiết lập lại vị trí duyệt lúc đầu.Với khái niệm trên, tất cả chúng ta có thể khẳng định rằng IEnumerator giúp tất cả chúng ta duyệt thành phần thế nào? Mặc định .NET giúp tất cả chúng ta duyệt từ thành phần đầu tới thành phần cuối của list. Ở ví dụ trên tất cả chúng ta sử dụng hàm _listInt.GetEnumerator() (vì mảng cũng implement interface IEnumerable) để trả về đối tượng người sử dụng tương ứng. Giờ tất cả chúng ta hãy tự tạo ra một phương pháp duyệt nhưng có cùng kết quả như trên.

public class MyIntergerEnumerator : IEnumerator { private readonly int[] _listInt; private int _currentIndex = -1; public MyIntergerEnumerator(int[] listInt) { _listInt = listInt; } public object Current { get { return _listInt[_currentIndex]; } } public bool MoveNext() { _currentIndex++; return _currentIndex < _listInt.Length; } public void Reset() { _currentIndex = -1; } }

Và đoạn code ví dụ trên sẽ tiến hành thay thành

public class MyIntergerCollection : IEnumerable { private readonly int[] _listInt; public MyIntergerCollection(int[] listInt) { _listInt = listInt; } public IEnumerator GetEnumerator() { return new MyIntergerEnumerator(_listInt); } }

Đọc đến đây chắc các các bạn sẽ nghĩ rằng vì sao phải làm như vậy (viết 2 class mới là MyIntergerCollection, MyIntergerEnumerator) trong những khi .NET đã tương trợ? Thực tế với cách viết như này, tất cả chúng ta có thể:- Tạo ra một kiểu collection mới có thể thực hiện duyệt bằng foreach- Tùy biến quá trình duyệtNhư ví dụ phía trên, tất cả chúng ta thấy rằng quá trình foreach xuất phát điểm từ thành phần trước nhất đến thành phần cuối cùng. Giờ tất cả chúng ta hãy thử với trường hợp foreach từ thành phần cuối đến thành phần trước nhất, tất cả chúng ta chỉ có chỉnh lại class MyIntergerEnumerator như sau:

public class MyIntergerEnumerator : IEnumerator { private readonly int[] _listInt; private int _currentIndex; public MyIntergerEnumerator(int[] listInt) { _listInt = listInt; _currentIndex = _listInt.Length; } public object Current { get { return _listInt[_currentIndex]; } } public bool MoveNext() { _currentIndex-; return _currentIndex >= 0; } public void Reset() { _currentIndex = _listInt.Length; } }

Và kết quả của lớp học là:

10 9 8 7 6 5 4 3 2 1

Ohh, thật thú vị phải không các bạn.

Tóm lại:

Nội dung bài viết trên đây, tôi đã giới thiệu với những bạn về IEnumerable và IEnumerator, rất mong những điều này sẽ giúp ích cho những bạn trong công việc cũng như học tập của mình.

You May Also Like

About the Author: v1000