У меня есть простой класс, определенный как:Поиск иерархического списка
public class IndexEntry
{
public bool HighScore { get; set; }
public List<IndexEntry> SubEntries { get; set; }
//Other properties, etc...
}
мне теперь нужно искать через список, чтобы найти один элемент, который установлен его рекорды недвижимости в правда. Поскольку это не плоский список, а иерархия, которая может быть неизвестным количеством уровней, и поскольку элемент, который я ищу, может содержаться в любом из списков SubEnties, я не могу сделать простой Лямбду это:
var foundHighScore = myList.FirstOrDefault(IE => IE.HighScore == true);
Вот код, который у меня есть. Я знаю, что это уродливо (по крайней мере, мне кажется это так). Он работает, но медленнее, чем грех в даже удаленно большом списке, и я уверен, что должен быть лучший способ.
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;
}
Я должен верить, что есть лучший способ, используя немного более сложный лямбда или с помощью LINQ, чтобы очистить этот код и сделать его более производительным.
Заранее за вашу помощь.
Judah. Мне нравится ваша общая идея, но мне не достаточно удобно в C# для устранения проблемы, связанной с вашим кодом. Когда я пытаюсь выполнить код, я получаю следующую ошибку: тело IEnumerableExtensions.Flatten (System.Collections.Generic.IEnumerable , System.Func >) 'не может быть блок итератора, потому что «void» не является типом интерфейса итератора. –
Эта ошибка подсказывает мне, что вам нужно вернуть тип (IEnumerable возможно?), А затем работать с этим элементом? –
@Steve, вы правы, его метод должен иметь возвращаемый тип IEnumerable для выхода на работу. –
James