Ienumerable là gì

     

Đón mùa World Cup thuộc Nhà cái OLE777


Khi áp dụng C# nhằm lập trình, chúng ta cũng có thể đã phát hiện từ khóa yield rất nhiều lần mà lại rất ít khi bọn họ biết được nó là gì và có tính năng như nào? Hôm nay, bản thân sẽ chia sẻ với chúng ta những đọc biết của chính mình về yield, rất mong muốn những share này sẽ có lợi cho chúng ta trên con đường thành master C# nhé.

Bạn đang xem: Ienumerable là gì

Đang xem: Ienumerable là gì

Trước khi nói đến từ khóa yield, bọn họ cùng kể lại về IEnumerable.

1. IEnumerable là gì

IEnumerable là 1 trong danh sách có các thuộc tính sau:– danh sách chỉ đọc, ko được phép thêm/bớt phần tử- Chỉ chăm chú một chiều từ trên đầu tới cuối danh sách. Sử dụng foreach để triển khai duyệt

Các chúng ta cũng có thể tham khảo tại nội dung bài viết “IEnumerable và IEnumerator trong C#” tại đây.

Xem thêm: Đọc Cuộc Sống Rất Giống Cuộc Đời Wattpad, Cuộc Sống Đếch Giống Cuộc Đời

2. Yield là gì

Yield là trường đoản cú khóa sẽ báo cho biết cho trình biên dịch hiểu được phương thức, toán tử, get cơ mà nó xuất hiện thêm sẽ là một khối lặp. Trình biên dịch sẽ tự động sinh ra một class implement từ bỏ IEnumerable, IEnumerator để biểu thị khối lặp đó.

Chúng ta hãy xét lấy ví dụ như sau:

class Program private static IEnumerable Ints() for (var i = 0; i sau khoản thời gian biên dịch sang file exe và dịch ngược lại file exe đó, bọn họ thu được class như sau:

internal class Program // Methods private static IEnumerable Ints() this.5__1 = 0; while (this.5__1 5__1; int num2 = this.5__1; this.5__1 = num2 + 1; private static void Main(string args) foreach (int num in Ints()) Console.WriteLine(num); Console.ReadKey(); // Nested Types private sealed class d__1 : IEnumerable, IEnumerable, IEnumerator, IDisposable, IEnumerator // Fields private int 1__state; private int 2__current; private int l__initialThreadId; private int 5__1; // Methods public d__1(int 1__state) this.1__state = 1__state; this.l__initialThreadId = Environment.CurrentManagedThreadId; private bool MoveNext() switch (this.1__state) case 0: this.1__state = -1; this.5__1 = 0; while (this.5__1 2__current = this.5__1; this.1__state = 1; return true; Label_003F: this.1__state = -1; int num2 = this.5__1; this.5__1 = num2 + 1; return false; case 1: goto Label_003F; return false; IEnumerator IEnumerable.GetEnumerator() if ((this.1__state == -2) && (this.l__initialThreadId == Environment.CurrentManagedThreadId)) this.1__state = 0; return this; return new Program.d__1(0); IEnumerator IEnumerable.GetEnumerator() => this.System.Collections.Generic.IEnumerable.GetEnumerator(); void IEnumerator.Reset() throw new NotSupportedException(); void IDisposable.Dispose() // Properties int IEnumerator.Current => this.2__current; object IEnumerator.Current => this.2__current; Giờ chúng ta lưu ý:HàmIEnumerable Ints() có mở ra từ khóa yield với được gán thêm thuộc tínhIteratorStateMachine(typeof(d__1)), với ở trong tính này trình biên dịch sẽ chứng thực hàm trên là 1 trong khối lặp (hoặc có thể gọi là state machine).Classd__1 được trình biên dịch sinh ra, implement từ IEnumerable, IEnumerator để tiến hành cho khối lặp trên.

Xem thêm: Những Câu Thơ Hay Nói Về Tình Yêu Buồn Hay Nhất Về Tình Yêu, Cuộc Sống

3. Phương pháp sử dụng

Từ khóa yield được thực hiện trong 2 tình huống như sau:

yield return ;yield break;Lưu ý:– Đối với hàm hoặc get thực hiện từ khóa yield cần phải trả về kiểu tài liệu là IEnumerable, IEnumerable, IEnumerator hoặc IEnumerator.- Sử dụng trong tầm lặp có điều kiện (nếu không có điều kiện thì trả luôn luôn danh sách cần không tính trường vừa lòng này).- giữ trạng thái của lần lặp trước.Ví dụ họ có list gồm 10 bộ phận từ 0 mang đến 9 như sau:

private static danh mục MyList = new danh sách 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;3.1. Yield returnNếu là hàm không sử dụng yield thì khi return, chương trình sẽ thoát thoát khỏi hàm đó.Nếu là hàm thực hiện yield return thì công tác sẽ trả về tài liệu và trở lại vòng lặp để thực hiện vòng lặp tiếp theo.Chúng ta xem lấy ví dụ như liệt kê các phần tử có giá trị lớn hơn 3 bởi 2 bí quyết như sau:

class Program private static menu MyList = new danh mục 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ; private static IEnumerable NoneYield() var d = new List(); foreach (var tòa tháp in MyList) if (item > 3) d.Add(item); return d; private static IEnumerable UseYield() foreach (var cửa nhà in MyList) if (item > 3) yield return item; static void Main(string args) Console.WriteLine(“None Yield”); foreach (var tác phẩm in NoneYield()) Console.WriteLine(item); Console.WriteLine(“Yield”); foreach (var công trình in UseYield()) Console.WriteLine(item); Console.ReadKey(); Kết quả đã như sau:

*

còn nếu như không sử dụng yield, để trả về list như trên, chúng ta phải tạo thành một list tạm nhằm lưu những thành phần thỏa mãn điều kiện, sau thời điểm lưu hết những bộ phận đó mới tiến hành return.Nếu áp dụng yield thì sau thời điểm yield return, chương trình tiến hành tiếp vòng foreach tiếp theo.

3.2. Yield break

Nếu vòng lặp áp dụng break, khi gặp lệnh break, chương trình chỉ thoát ra khỏi vòng lặp, phần đông dòng phía đằng sau và ko kể vòng lặp vẫn được thực hiện.Nếu vòng lặp áp dụng yield break, lịch trình sẽ thoát ra khỏi hàm mà không thực hiện các lệnh phía dưới.Chúng ta xét bài toán: liệt kê các thành phần khác 3 (khi gặp mặt giá trị 3 thì dừng):

class Program private static menu MyList = new menu 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ; private static IEnumerable NoneYield() var d = new List(); foreach (var tòa tháp in MyList) if (item != 3) d.Add(item); else break; Console.WriteLine(“Done”); // thực hiện dòng này để sáng tỏ return d; private static IEnumerable UseYield() foreach (var cửa nhà in MyList) if (item != 3) yield return item; else yield break; Console.WriteLine(“Done”); // áp dụng dòng này để minh bạch static void Main(string args) Console.WriteLine(“None Yield”); foreach (var tòa tháp in NoneYield()) Console.WriteLine(item); Console.WriteLine(“==============================================”); Console.WriteLine(“Yield”); foreach (var cống phẩm in UseYield()) Console.WriteLine(item); Console.ReadKey(); Và hiệu quả sẽ như sau: