Mam prostą klasę zdefiniowaną jako:wyszukiwania hierarchiczną listę
public class IndexEntry
{
public bool HighScore { get; set; }
public List<IndexEntry> SubEntries { get; set; }
//Other properties, etc...
}
Teraz trzeba przeglądać listy, aby znaleźć jeden element, który ma jej HighScore nieruchomości ustawiony prawda. Ponieważ nie jest to płaska lista, ale Hierarchia, która może być nieznaną liczbą głębokich poziomów, a przedmiot, którego szukam, może znajdować się na dowolnej liście SubEnties, nie mogę zrobić prostej Lambdy to:
var foundHighScore = myList.FirstOrDefault(IE => IE.HighScore == true);
Oto kod, który mam. Wiem, że to brzydkie (przynajmniej tak mi się wydaje). Działa, ale jest powolny jak grzech na nawet zdalnie dużej liście i jestem pewien, że musi być lepszy sposób.
private IndexEntry GetHighScoreEntry(IEnumerable<IndexEntry> entryList)
{
IndexEntry result = null;
IndexEntry recursiveResult = null;
foreach (IndexEntry currentEntry in entryList)
{
if (currentEntry.HighScore)
{
result = currentEntry;
break; //Don't need to look anymore, we found our highscore.;
}
else
{
if ((currentEntry.SubEntries == null) || (currentEntry.SubEntries.Count < 1))
{
continue;
}
else
{
recursiveResult = GetHighScoreEntry(currentEntry.SubEntries);
if (recursiveResult == null)
continue;
result = recursiveResult;
break;
}
}
}
return result;
}
Mam uwierzyć, że istnieje lepszy sposób, używając nieco bardziej skomplikowany lambda lub LINQ aby oczyścić ten kod i uczynić go bardziej wydajnych.
Z góry dziękuję za pomoc.
Juda. Podoba mi się twój ogólny pomysł, ale nie jestem wystarczająco spokojny w C#, aby rozwiązać problem, który mam z twoim kodem. Kiedy próbuję skompilować twój kod, otrzymuję następujący błąd: Ciało "IEnumerableExtensions.Flatten (System.Collections.Generic.I liczenie , System.Func >)" nie może być blok iteracyjny, ponieważ "void" nie jest typem interfejsu iteratora. –
Ten błąd sugeruje, że musisz zwrócić typ (IEnumerable może?), A następnie pracować z tym elementem? –
@Steve, masz rację, jego metoda musi mieć typ zwrotu IEnumerable, aby wydajność działała. –
James