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ỉ?

Mình nghĩ là được. Nếu theo mình hiểu đúng ý của bạn :smile: 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:

#define YieldReturn(condition) if(condition == true) yield return 1

IEnumerator<int> SomeMethod(bool condition)
{
   std::cout << "1" << std::endl;
   YieldReturn(condition);
   std::cout << "2" << std::endl;
   yield break;
}

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 :slight_smile: , 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 :smiley: , 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 :slight_smile:

Update tí:

  • C++ trong Visual Studio đã hỗ trợ coroutine (co_yield, co_return);
  • Theo thường thức của mình, hiện tại Lua là ngôn ngữ duy nhất cho phép yield, hoặc return khỏi coroutine từ function bất kỳ.

Cho mình hỏi ý nghĩa của yield và return break với.


Cảm ơn nhé. Đã hiểu.

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?