Tôi đã có một lớp đơn giản định nghĩa là:Tìm kiếm Hierarchical Danh sách
public class IndexEntry
{
public bool HighScore { get; set; }
public List<IndexEntry> SubEntries { get; set; }
//Other properties, etc...
}
bây giờ tôi cần phải tìm kiếm thông qua một danh sách để tìm ra một mục mà có điểm cao tài sản của nó thiết lập để đúng. Vì nó không phải là một danh sách phẳng, nhưng một hệ thống cấp bậc có thể là một số lượng không biết cấp độ sâu và vì mục tôi đang tìm kiếm có thể chứa trong bất kỳ danh sách SubEnties nào, tôi không thể làm một Lambda đơn giản như này:
var foundHighScore = myList.FirstOrDefault(IE => IE.HighScore == true);
Đây là mã tôi có. Tôi biết nó xấu xí (ít nhất là nó có vẻ như vậy với tôi). Nó hoạt động, nhưng chậm như tội lỗi trên một danh sách thậm chí từ xa lớn và tôi chắc chắn phải có một cách tốt hơn.
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;
}
Tôi đã tin rằng có cách tốt hơn bằng cách sử dụng lambda phức tạp hơn một chút hoặc LINQ để xóa mã này và làm cho nó hoạt động hiệu quả hơn.
Cảm ơn trước sự giúp đỡ của bạn.
Giu-đa. Tôi thích ý tưởng tổng thể của bạn, nhưng không đủ thoải mái trong C# chưa khắc phục sự cố tôi gặp phải với mã của bạn. Khi tôi cố gắng để comple mã của bạn tôi nhận được lỗi sau đây - Cơ thể của 'IEnumerableExtensions.Flatten (System.Collections.Generic.IEnumerable , System.Func >)' không thể một khối lặp bởi vì 'void' không phải là một loại giao diện trình lặp. –
Lỗi này gợi ý với tôi rằng bạn cần phải trả về một loại (IEnumerable có lẽ?) Và sau đó làm việc với mục đó? –
@Steve, bạn là đúng phương pháp của mình phải có kiểu trả về của IEnumerable để có năng suất hoạt động. –
James