Yield C# Là Gì

     
IEnumerable là gì?

Trong CSharp khi làm việc với array, bọn họ thấy được những giảm bớt của nó là phải gồm size, đề xuất viết các functional count, insert, delete …. Vì thế , csharp sinh ra một số interface giao hàng , như IEnumerable, ICollection, IList, IQueryable . Toàn bộ đều ở trong về name space System.Collections. IEnumerable là một mảng chỉ rất có thể đọc, chẳng thể thêm hay sút phần tử, chỉ phê duyệt theo một chiều, từ đầu tới cuối mảng.

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

Từ khoá Yield?

Từ khóa yield báo cho biết cho trình biên dịch rằng cách làm mà nó mở ra là một khối lặp (iterator block). Trình biên dịch tạo nên một lớp nhằm implement hành vi được thể hiện trong khối lặp. Trong khối lặp, tự khóa yield được thực hiện cùng với từ bỏ khóa return để cung ứng giá trị cho đối tượng người dùng liệt kê (enumerator object). Đây là giá trị được trả về. Từ bỏ khóa yield cũng rất được sử dụng break để báo hiệu xong lặp (iteration).

Xem thêm: Mua Giống Lúa St25 Ở Đâu - Loạn Giống Lúa St24, St25

Phương thức có sử dụng từ khóa yield sẽ phải trả về kiểu tài liệu là IEnumerable.

Xem thêm: Bóng Đá Euro 2021 Phát Trên Kênh Nào ? Các Kênh Xem Trực Tiếp Euro 2021

Ví dụ, Ta muốn lôi ra tất cả vị trí mở ra của số 7 vào collection "listData":

using System;using System.Collections.Generic; namespace Phan.Cao.Khoa class Program static void Main(string<> args) // Create new object danh sách Listint> listData = new Listint>() 6, 7, 3, 3, 1, 7, 4, 3, 7, 2, 8, 5, 7, 4 ; // Display all position number 7 in menu object foreach (var index in GetListIndex1(listData, 7)) Console.Write(index + " "); foreach (var index in GetListIndex2(listData, 7)) Console.Write(index + " "); // Output: 1 5 8 12 // Usually Dev use this scenario private static Listint> GetListIndex1(Listint> listData, int valueFind) Listint> listIdx = new Listint>(); for (int ii = 0; ii listData.Count; ii++) if (listData == valueFind) listIdx.Add(ii); return listIdx; // Use yield private static IEnumerableint> GetListIndex2(Listint> listData, int valueFind) for (int ii = 0; ii listData.Count; ii++) if (listData == valueFind) yield return ii; Nhìn 2 function thì dường như giống nhau. Cần sử dụng Yield thì tiết kiệm ngân sách và chi phí dc 2 loại code thôi cơ mà

*
nhưng về performance khác nhau rõ đấy. Bởi vì trong quá trình runtime, chương trình sẽ khiêu vũ qua lại giữa 2 cách tiến hành “Main” với “GetListIndex2” để lấy giá trị, mà chưa hẳn tốn bộ nhớ lưu trữ để chế tạo một thay đổi “listIdx” để lưu trữ như làm theo cách thông thường. Vày đó, đối với dữ liệu mập thì điều này là một trong sự nâng cấp hiệu năng đáng kể.

Bản chất buổi giao lưu của Yield là:

Mỗi khi tìm thấy giá trị số “7” trong mảng “listData” thì nó sẽ return quý hiếm đó, mà lại không thoát ra khỏi method “GetListIdx2” tức thì lập tức, cơ mà sẽ ghi lại lại địa chỉ lặp đó.Sau lúc return cực hiếm ra, thì nó sẽ tiếp tục quay lại vào bên trong vòng lặp, tiếp tục lặp mang đến vị trí tiếp sau từ vị trí đã đánh dấu trước kia để tiếp tục tìm kiếm,…Phân biệt Return và Yield Return?

Như bọn họ đã biết từ bỏ khóa return sẽ ngừng method, trả ra tác dụng và ko chạy thêm bất kể câu lệnh gì phía sau:

public int GetNumber() return 5; Console.WriteLine(GetNumber()); // Output: 5Nhưng khi sử dụng yield ta có thể viết như này:

public IEnumerableint> GetNumber() yield return 5; yield return 10; yield return 15;foreach (int i in GetNumber()) Console.WriteLine(i); // Output: 5 10 15Wow kinh ngạc chưa nó in ra được 3 công dụng lận. Vày sao vậy :

Khi call method GetNumber, lấy phần từ trên đầu tiên, lịch trình chạy tới mẫu lệnh số 3, mang ra hiệu quả là 5, in ra console.Duyệt tiếp phần tự tiếp theo, chương trình chạy vào dòng lệnh số 4, lấy tác dụng 10, in ra màn hình.Tương từ bỏ với thành phần cuối cùng, sau khi in ra, lịch trình kết thúc.Sử dụng Yield lúc nào?Khi phải function của công ty trả về một list read-only, chỉ đọc, ko được thêm giảm xóa sửa thì ta cần sử dụng Yield return.Nhiều khi đã maintain một source code và giải vấn đề input đầu vào là 1 trong những collection dạng IEnumerable với thêm sửa xoá collection kia một cách sớm nhất mà không phải chuyển kiểu. Thì chắc chắn rằng phải sử dụng Yield.Những method common nhằm thêm sửa xoá phần tử trong IEnumerable?

Add

public static IEnumerableT> AddT>(this IEnumerableT> enumerable, T value) foreach (var chiến thắng in enumerable) yield return item; yield return value;or:

public static IEnumerableT> AddT>(this IEnumerableT> enumerable, T value) return enumerable.Concat(new T<> value );Insert

public static IEnumerableT> InsertT>(this IEnumerableT> enumerable, int index, T value) int current = 0; foreach (var tòa tháp in enumerable) if (current == index) yield return value; yield return item; current++; or

public static IEnumerableT> InsertT>(this IEnumerableT> enumerable, int index, T value) return enumerable.SelectMany((x, i) => index == i ? new T<> value, x : new T<> x );Replace

public static IEnumerableT> ReplaceT>(this IEnumerableT> enumerable, int index, T value) int current = 0; foreach (var chiến thắng in enumerable) yield return current == index ? value : item; current++; or

public static IEnumerableT> ReplaceT>(this IEnumerableT> enumerable, int index, T value) return enumerable.Select((x, i) => index == i ? value : x);Remove

public static IEnumerableT> RemoveT>(this IEnumerableT> enumerable, int index) int current = 0; foreach (var thành công in enumerable) if (current != index) yield return item; current++; or

public static IEnumerableT> RemoveT>(this IEnumerableT> enumerable, int index) return enumerable.Where((x, i) => index != i);Trong cách tiến hành chính chúng ta gọi như sau:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/yield