int index = -1;
for (int j = 0; j < arr.Length; j++)
{
if (MyPredicate(arr[j]))
{
index = j;
break;
}
}
News:
|
public static class MyExtensions
{
public static int IndexByPredicate<T>(this IList<T> source, Func<T, bool> predicate)
{
int index = -1;
for (int i = 0; i < source.Count; ++i)
{
if (predicate(item))
{
index = i;
break;
}
}
return index;
}
}
|
+1 Das war die andere Alternative, die mir dann auch noch in den Sinn gekommen war. Wenn man's häufiger braucht, ist das wohl auf jeden Fall die schönere Lösung. Wär vielleicht auch was für's dotnetpro-Extension-Projekt?
– Matthias Hlawatsch 01.06.2011
|
||
Da dotnetpro-Extension-Projekt kenn ich gar nicht ;-)
Ich finde solche Erweiterungsmethoden sehr praktisch da die Verwendung deklarativen Hauch hat. – gfoidl 02.06.2011
|
||
http://dnpextensions.codeplex.com/
Und wer hätte das gedacht: für IList<T> gibt es dort schon die Erweiterungsmethode public static int IndexOf<T>(this IList<T> list, Func<T, bool> comparison) mit genau dieser Funktionalität. IList ist irgendwie auch sinnvoll: wenn ich nach einem Index frage, sollte ich eine definierte Reihenfolge haben. – Matthias Hlawatsch 02.06.2011
|
||
Hast recht dass IList sinnvoller ist als IEnumerable. Habs oben auch geändert. Danke für den Hinweis (und den Link).
– gfoidl 02.06.2011
|
|
Sorry, den ersten Satz verstehe ich nicht. Und der Index ist für mich in dem Fall wesentlich.
– Matthias Hlawatsch 01.06.2011
|
||
Enumerable.Range(0, arr.Length)
.Where(i => MyPredicate(arr[i]))
.DefaultIfEmpty(-1)
.First();
|
Immerhin übersichtlicher als mein Ansatz mit dem anonymen Objekt. Aber wohl trotzdem kein Code, dem ein unvorbereiteter Leser ohne Kommentar ansieht, was das eigentliche Ziel ist. Wobei - wenn man das Ganze auf zwei Zeilen aufteilt, könnte es leserlich werden. Ich werde mal meine Antwort erweitern.
Auf DefaultIfEmpty war ich noch nicht gestoßen, danke für den Hinweis. Warum Microsoft hier eine Überladung spendiert hat, die die Vorgabe des gewünschten Defaults ermöglicht, bei FirstOrDefault() hingegen nicht, wird wohl ihr Geheimnis bleiben. – Matthias Hlawatsch 01.07.2011
|
var hit = arr.Select((item, index) => new { item, index }).Where((anon) => MyPredicate(anon.item)).FirstOrDefault();
int theIndex = hit == null ? -1 : hit.index;
var indices = Enumerable.Range(0, arr.Length);
int theIndex = indices.Where(i => MyPredicate(arr[i])
.DefaultIfEmpty(-1)
.First();
|