Tôi thường thấy mình cần phải đi qua cây của các đối tượng phân cấp và thực hiện các thao tác trên mỗi mục trên đường đi. Có một tên được chấp nhận chung cho loại hoạt động này trong danh sách tiếng địa phương không? Tôi hỏi bởi vì tôi nhớ lần đầu tiên tìm hiểu về python's zip function trở lại trước khi nó có một tương đương trong khuôn khổ .net và nghĩ rằng nó có một cái tên khác thường nhưng thích hợp.Có tên được chấp nhận cho loại hoạt động này không?
Dưới đây là một vài phương pháp tổng quát giúp tái cấu trúc cây lên và xuống và mang lại từng mục khi chúng gặp phải.
public static IEnumerable<T> Ancestors<T>(T source, Func<T, T> selector)
{
do
{
yield return source;
source = selector(source);
} while (!Equals(source, default(T)));
}
public static IEnumerable<T> Descendents<T>(T source,
Func<T, IEnumerable<T>> selector)
{
var stack = new Stack<T>();
stack.Push(source);
while (stack.Count > 0)
{
source = stack.Pop();
yield return source;
var items = selector(source);
if (items != null)
{
foreach (var item in items)
{
stack.Push(item);
}
}
}
}
Một số loại cây ngang qua được lọc? Tôi không biết nếu điều này có một tên cụ thể. Tôi không nghĩ là nó có. –
Cách thứ hai là thực hiện tìm kiếm theo chiều sâu. Không chắc tên thứ hai có tên, vì mặc dù nó được gọi là "Ancestors' tùy thuộc vào chức năng chọn, nó không cần phải thực sự theo 'cha mẹ' chút nào (ví dụ: nó có thể làm bất cứ điều gì, ví dụ như chọn một con" tốt nhất " node) –
@George: Chính xác, 'Tổ tiên' ngụ ý một loại quan hệ phân cấp nhất định. Trong thực tế nó có thể dễ dàng được sử dụng để đi qua một danh sách liên kết gấp đôi theo một trong hai hướng hoặc theo bất kỳ loại đường mòn tùy ý nào. –