Không chắc làm thế nào để gọi nó, nhưng nói rằng bạn có một lớp trông như thế này:Làm thế nào để "cuộn" a "đệ quy" cấu trúc
class Person
{
public string Name;
public IEnumerable<Person> Friends;
}
Sau đó bạn có một người và bạn muốn "cuộn" cấu trúc này đệ quy để bạn kết thúc với một danh sách duy nhất của tất cả mọi người mà không có bản sao.
Bạn sẽ làm như thế nào? Tôi đã tạo ra một thứ gì đó có vẻ như đang hoạt động, nhưng tôi tò mò muốn xem người khác sẽ làm như thế nào và đặc biệt nếu có thứ gì đó tích hợp với LINQ, bạn có thể sử dụng một cách thông minh để giải quyết vấn đề nhỏ này :)
đây là giải pháp của tôi:
public static IEnumerable<T> SelectRecursive<T>(this IEnumerable<T> subjects, Func<T, IEnumerable<T>> selector)
{
// Stop if subjects are null or empty
if(subjects == null)
yield break;
// For each subject
foreach(var subject in subjects)
{
// Yield it
yield return subject;
// Then yield all its decendants
foreach (var decendant in SelectRecursive(selector(subject), selector))
yield return decendant;
}
}
có thể được sử dụng một cái gì đó như thế này:
var people = somePerson.SelectRecursive(x => x.Friends);
Có vẻ tốt với tôi. – cjk
Tôi đang thiếu một cái gì đó ... nếu bạn có vòng ở đó, nó sẽ bao giờ dừng lại? – Kobi
@Kobi: Điều này được thực hiện bởi 'if (! Subject.Any()) ngắt kết quả;' – Oliver