Đây là mã từ câu trả lời của Marc Gravell , cùng với một ví dụ về việc sử dụng nó.
using System;
using System.Collections.Generic;
using System.Linq;
public static class Utils
{
public static bool IsAny<T>(this IEnumerable<T> data)
{
return data != null && data.Any();
}
}
class Program
{
static void Main(string[] args)
{
IEnumerable<string> items;
//items = null;
//items = new String[0];
items = new String[] { "foo", "bar", "baz" };
/*** Example Starts Here ***/
if (items.IsAny())
{
foreach (var item in items)
{
Console.WriteLine(item);
}
}
else
{
Console.WriteLine("No items.");
}
}
}
Như ông nói, không phải tất cả các chuỗi đều có thể lặp lại, do đó mã đôi khi có thể gây ra vấn đề, bởi vì IsAny()
bắt đầu bước qua chuỗi. Tôi nghi ngờ câu trả lời của Robert Harvey có nghĩa là bạn thường không cần kiểm tra null
và bỏ trống. Thông thường, bạn chỉ có thể kiểm tra null và sau đó sử dụng foreach
.
Để tránh bắt đầu chuỗi hai lần và tận dụng foreach
, tôi chỉ viết một số mã như thế này:
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main(string[] args)
{
IEnumerable<string> items;
//items = null;
//items = new String[0];
items = new String[] { "foo", "bar", "baz" };
/*** Example Starts Here ***/
bool isEmpty = true;
if (items != null)
{
foreach (var item in items)
{
isEmpty = false;
Console.WriteLine(item);
}
}
if (isEmpty)
{
Console.WriteLine("No items.");
}
}
}
Tôi đoán phương thức mở rộng giúp bạn tiết kiệm một vài dòng gõ, nhưng mã này có vẻ rõ ràng hơn đối với tôi. Tôi nghi ngờ rằng một số nhà phát triển sẽ không ngay lập tức nhận ra rằng IsAny(items)
sẽ thực sự bắt đầu bước qua chuỗi. (Tất nhiên nếu bạn đang sử dụng nhiều trình tự, bạn sẽ nhanh chóng học cách suy nghĩ về những bước qua chúng.)