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

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

Đang xem: Ienumerable trong c# là gì

Trước khi nói về từ khóa yield, chúng ta cùng nhắc 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, không được phép thêm/bớt phần tử- Chỉ chuẩn y một chiều từ đầu tới cuối danh sách. Sử dụng foreach để tiến hành duyệt

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

2. Yield là gì

Yield là từ 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 nhưng nó xuất hiện thêm sẽ là một khối lặp. Trình biên dịch sẽ auto sinh ra một class implement từ bỏ IEnumerable, IEnumerator để trình bày 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 khi biên dịch sang file exe và dịch ngược lại file exe đó, 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ờ các bạn lưu ý:HàmIEnumerable Ints() có xuất hiện từ khóa yield và được gán thêm ở trong tínhIteratorStateMachine(typeof(d__1)), với thuộc tính này trình biên dịch sẽ chứng thực hàm trên là 1 trong những khối lặp (hoặc hoàn toàn 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.

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 dữ liệu là IEnumerable, IEnumerable, IEnumerator hoặc IEnumerator.- Sử dụng trong khoảng lặp có điều kiện (nếu không có điều khiếu nại thì trả luôn luôn danh sách nên không tính trường đúng theo này).- lưu lại trạng thái của lần lặp trước.Ví dụ bọn họ có danh sách gồm 10 thành phần từ 0 đến 9 như sau:

private static các mục MyList = new danh mục 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ;3.1. Yield returnNếu là hàm không áp dụng yield thì lúc return, chương trình sẽ thoát thoát khỏi hàm đó.Nếu là hàm sử dụng yield return thì chương trình sẽ trả về dữ 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 ví dụ liệt kê các phần tử có giá chỉ trị to hơn 3 bởi 2 bí quyết như sau:

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

*
*
*

Ohh, chuyện gì xảy ra vậy? Sao hiệu quả lại là 1 trong 2 4 7 11??? bọn họ hãy để breakpoint tại mẫu 1, 3, 5, 6, 8 cùng thử debug xem các bước thực hiện:Bước 1: triển khai chạy công tác đến dòng 1, thường xuyên thực hiện sẽ nhảy đến dòng 5 => biến chuyển total được gán là 1.Bước 2: ban đầu vòng lặp và gán i = 0, thường xuyên thực hiện đến cái 8 => biến chuyển total = total + i => có giá trị 1 với yield return quý hiếm 1. Tiếp tục thực hiện đã in 1 ra màn hình.Bước 3: liên tiếp thực hiện tại vòng lặp dòng 1, thường xuyên thực hiện sẽ nhảy đến dòng 6 => với giá trị i = 1. Thường xuyên thực hiện total = total + i = 2 => yield return quý hiếm 2. Liên tiếp thực hiện vẫn in 2 ra màn hình.Bước 4: liên tục thực hiện vòng lặp loại 1, tiếp tục thực hiện đã nhảy đến cái 6 => với cái giá trị i = 2. Liên tục thực hiện total = total + i = 4 => yield return cực hiếm 4. Liên tục thực hiện vẫn in 4 ra màn hình.Từ bước này chúng ta thấy rằng bài toán gán biến chuyển total = 1 chỉ ra mắt 1 lần, quý hiếm này được tái thực hiện cho lần lặp tiếp theo. Điều này giải thích cho bài toán lưu lại tâm lý khi sử dụng yield.Bước 5: các bước được lặp lại cho đến i = 4.

Xem thêm: Facebook Engagement Là Gì - Engagemant Phố Biến Trên Facebook

Tạm kết

Trên đây mình đã giới thiệu với chúng ta về từ bỏ khóa Yield, cách thức sử dụng cùng các xem xét khi thao tác làm việc với yield. Hi vọng nội dung bài viết có ích với các bạn. Nếu bao gồm gì còn thắc mắc, hãy nhằm lại comment nhé.