Ось код з відповіді Марка Гравелла разом із прикладом його використання.
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.");
}
}
}
За його словами, не всі послідовності повторюються, так що код може іноді викликати проблеми, оскільки IsAny()
починає переходити через послідовність. Я підозрюю, що означала відповідь Роберта Харві - те, що вам часто не потрібно перевіряти null
та видаляти. Часто можна просто перевірити наявність нуля, а потім використовувати foreach
.
Щоб уникнути запуску послідовності двічі та скористатися нею foreach
, я просто написав такий код, як цей:
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.");
}
}
}
Я думаю, що метод розширення економить вам пару рядків набору тексту, але цей код мені здається більш зрозумілим. Я підозрюю, що деякі розробники не відразу зрозуміють, що IsAny(items)
насправді почнуть переходити через послідовність. (Звичайно, якщо ви використовуєте багато послідовностей, ви швидко навчитесь думати про те, які кроки проходять через них.)