Hier ist der Code aus Marc Gravells Antwort sowie ein Beispiel für die Verwendung.
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.");
}
}
}
Wie er sagt, sind nicht alle Sequenzen wiederholbar, so dass Code manchmal Probleme verursachen kann, da er IsAny()
anfängt, die Sequenz zu durchlaufen. Ich vermute, was Robert Harveys Antwort bedeutete, war, dass Sie oft nicht nach etwas suchen null
und es leeren müssen. Oft kann man einfach nach null suchen und dann verwenden foreach
.
Um zu vermeiden, dass die Sequenz zweimal gestartet und ausgenutzt wird foreach
, habe ich einfach folgenden Code geschrieben:
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.");
}
}
}
Ich denke, die Erweiterungsmethode erspart Ihnen ein paar Zeilen beim Schreiben, aber dieser Code scheint mir klarer zu sein. Ich vermute, dass einige Entwickler nicht sofort erkennen würden, dass dies IsAny(items)
tatsächlich die Sequenz durchläuft. (Wenn Sie viele Sequenzen verwenden, lernen Sie natürlich schnell, darüber nachzudenken, welche Schritte sie durchlaufen.)