Вот код из ответа Марка Гравелла , а также пример его использования.
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)
самом деле начнут шагать по последовательности. (Конечно, если вы используете много последовательностей, вы быстро научитесь думать, какие шаги через них проходят.)