Tengo una clase simple definida como:buscando en la lista jerárquica
public class IndexEntry
{
public bool HighScore { get; set; }
public List<IndexEntry> SubEntries { get; set; }
//Other properties, etc...
}
ahora tengo que buscar a través de una lista para encontrar el elemento que tiene su propiedad establecida en HighScore cierto. Dado que no es una lista plana, sino una jerarquía que puede tener un número desconocido de niveles profundos y dado que el elemento que estoy buscando podría estar contenido en cualquiera de las listas de SubEnties, no puedo hacer un Lambda simple como esto:
var foundHighScore = myList.FirstOrDefault(IE => IE.HighScore == true);
Aquí está el código que tengo. Sé que es feo (al menos me parece así). Funciona, pero es lento como el pecado en una lista remotamente grande y estoy seguro de que debe haber una manera mejor.
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;
}
Tengo creen que hay una mejor manera de utilizar un poco más complejo lambda o con LINQ para limpiar el código y hacerlo más performante.
Gracias de antemano por su ayuda.
Judah. Me gusta su idea general, pero no soy lo suficientemente cómodo en C# para solucionar un problema que tengo con su código. Cuando intento completar su código, aparece el siguiente error: el cuerpo de 'IEnumerableExtensions.Flatten (System.Collections.Generic.IEnumerable , System.Func >)' no puede ser un bloque iterador porque 'void' no es un tipo de interfaz de iterador. –
¿Este error me sugiere que debe devolver un tipo (IEnumerable quizás?) Y luego trabajar con ese elemento? –
@Steve, tiene razón en que su método debe tener un tipo de devolución de IEnumerable para que el rendimiento funcione. –
James