| 

.NET C# Java Javascript Exception

1
Wenn ich eine Liste habe kann ich mit der Methode Exists() prüfen ob ein Element einem Prädikat (hier: l.Length > 5) entspricht.
list.Exists(l => l.Length > 5);

Da Exists aber nur für Listen existiert gibt es durch Linq eine neue Variante, nähmlich Any.
Sofern ich die Doku richtig verstanden haben machen die beiden Methoden das gleiche, Linq ist aber auf IEnumerable anwendbar.
Hier in Linq-Syntax:
IEnumerable.Any(a => a.Length > 5);

Was verwendet ihr? Gibt es Performance unterschiede?
News:
15.09.2009
Lugi 45 3
2 Antworten
4
List<T>.Exists (Func<T, bool>) ist seit Linq obsolet. Auch daran zu erkennen, dass Microsoft es bei Silverlight schon rausgeschmissen hat.

Falls Any<T>(this IEnumerable<T>, Func<T, bool>) der Performance-Bottleneck Deiner Applikation ist, lohnt es sich nicht zu überlegen, ob Exists (minimal) schneller ist, sondern Du musst den zugrundeliegenden Algorithmus so ändern, dass keine lineare Suche notwendig ist.
15.09.2009
pjacobi 1,1k 2 6
Mir gefällt der Hinweis auf die kritische Betrachtung der Performance.
Stichwort 'keine lineare Suche notwendig': Mengenbasierte Auflistungen wie HashSet, Dictionary, ...wären die (naive) Alternative.
gfoidl 15.09.2009
Nein kein Bottleneck, aber trotzdem danke für den Hinweis und die Lösung!
Lugi 15.09.2009
1
Noch als Ergänzung zu pjcaboi's Antwort:

In beiden Fällen wird über die zugrunde liegende Auflistung iteriert bis ein Treffer gefunden wurde. Der Aufwand ist für bei gleich groß.

ZB die Any-Erweiterungsmethode die als Parameter ein Prädikat entgegebennimmt:
public static bool Any<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
throw Error.ArgumentNull("source");

if (predicate == null)
throw Error.ArgumentNull("predicate");

foreach (TSource local in source)
if (predicate(local))
return true;

return false;
}

Die Exists-Methode der List<T> ist ähnlich vom Aufbau - verwendet for statt foreach ;)
15.09.2009
gfoidl 9,0k 3 5

Stelle deine .net-Frage jetzt!