30/09/2018, 23:20
[Hỏi] Cách return có điều kiện một cách ngắn gọn ở trong C#?
Giả sử mình có Method như thế này:
public static IEnumerator<int> SomeMethod(bool condition)
{
Console.WriteLine("1");
if (condition == true) // <==
yield return 1; // <==
Console.WriteLine("2");
yield break;
}
Bây giờ mình MUỐN chỗ yield return nó thành như thế này (vì mình muốn làm rất nhiều yield return kiểu như thế):
public static IEnumerator<int> SomeMethod(bool condition)
{
Console.WriteLine("1");
YieldReturn(condition); // <==
Console.WriteLine("2");
yield break;
}
Tức là mình gọi một method hoặc một cái gì đó, cái đó sẽ yield return hàm của mình nếu condition == true, nếu bằng false thì bỏ qua.
Liệu có cách nào đạt được không nhỉ?
Bài liên quan
Mình nghĩ là được. Nếu theo mình hiểu đúng ý của bạn thì để yield một hàm thì cái hàm của bạn cũng phải return ra kiểu dữ liệu là
IEnumerator<int>
:Ví dụ:
public IEnumerable<int> GetItems() { if (something) return GetItemsInternal(); return break; }
private IEnumerable<int> GetItemsInternal() { // the actual iterator with "yield return" goes here. yield Enumerable<int> result; }
Bạn kiểm tra lại syntax nhé
Không phải bạn ơi, hàm GetItems của bạn vẫn phải viết rõ câu lệnh If rồi. Ý mình muốn là viết gọn lại cơ.
Nếu C++ mà cũng hỗ trợ yield return thì mình có thể viết thế này:
Nhưng C# lại không hỗ trợ define macro…
Theo mình thì không có (hoặc ít nhất là mình chưa biết).
Từ khóa yield khi được thực thi sẽ được dùng để generate ra 1 sealed class, do đó để có thể generate được chính xác, từ khóa yield return buộc phải viết trong chính method.
Nếu bạn cần check điều kiện, bạn có thể (và tốt hơn) nên thực thi IEnumerable bình thường, sau đó dùng LINQ để lọc.
Cảm ơn bạn , thật ra mục đích của mình là dùng C# để làm scripting language ngay trong C# nên mới cần yield return nhiều như vậy. Không biết có tài liệu nào huớng dẫn cách mở rộng preprocessor cho C# không?
Tức là bạn muốn dùng C# để thực thi lệnh C# trong runtime? Nếu vậy thì theo mình nhớ C# có hỗ trợ (?)
Không phải đâu bạn, mình nói là scripting tức là ví như nó chạy như scripting language, chứ thật ra code chạy như bt thôi , kiểu như dùng file DLL A thì nó chạy một kiểu, thay bằng file DLL B thì nó chạy kiểu khác ấy, mình dùng yield return để kiểm soát thời điểm chạy của code. Mà thôi nếu không thể thì mình if else bt vậy
Update tí:
Cho mình hỏi ý nghĩa của yield và return break với.
C# 2 – Cơ chế yielding và ‘yield’ keyword trong Iteration
“yield” – Một từ khóa có vẻ lạ lẫm với bạn nhưng đã được ứng dụng từ lâu trong lĩnh vực lập trình và trong khá nhiều ngôn ngữ. Từ khóa này gắn liền với các kĩ thuật như Generator, Coroutine và các …
function* và yield trong Javascript generator function
function là một trong những chức năng mới của Javascript trong (Link) (6th Edition, hay tắt là ES6). function giúp khai báo 1 generator function, t...
Cảm ơn nhé. Đã hiểu.