2017-02-09 15 views
0

У меня есть следующий классC# Как найти конкретный пункт и это связано элементы из списка

public class Item 
{ 
    public int Id { get; set; } 
    public int ParentId { get; set; } 
    public string Content { get; set; } 
    public bool IsLastItem { get; set; } 
} 

Пусть у меня есть следующая модель, и я хочу, чтобы найти конкретную деталь Id и это связано пункт Идентификаторы. В этом сценарии я хочу найти Id элемента item9 и связанные с ним идентификаторы элементов.

Результат должен содержит 9, 10, 11, 12, 13, 14

Model

Я получаю список моей модели из базы данных, и я моделируется его в блоке кода, как этот

var items = new List<Item> 
{ 
    new Item 
    { 
     Id = 1, 
     ParentId = 0, 
     Content = "item1", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 2, 
     ParentId = 1, 
     Content = "item2", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 3, 
     ParentId = 1, 
     Content = "item3", 
     IsLastItem = true 
    }, 
    new Item 
    { 
     Id = 4, 
     ParentId = 1, 
     Content = "item4", 
     IsLastItem = true 
    }, 
    new Item 
    { 
     Id = 5, 
     ParentId = 2, 
     Content = "item5", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 6, 
     ParentId = 5, 
     Content = "item6", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 7, 
     ParentId = 5, 
     Content = "item7", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 8, 
     ParentId = 6, 
     Content = "item8", 
     IsLastItem = true 
    }, 
    new Item 
    { 
     Id = 9, 
     ParentId = 7, 
     Content = "item9", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 10, 
     ParentId = 9, 
     Content = "item10", 
     IsLastItem = true 
    }, 
    new Item 
    { 
     Id = 11, 
     ParentId = 9, 
     Content = "item11", 
     IsLastItem = false 
    }, 
    new Item 
    { 
     Id = 12, 
     ParentId = 11, 
     Content = "item12", 
     IsLastItem = true 
    }, 
    new Item 
    { 
     Id = 13, 
     ParentId = 11, 
     Content = "item13", 
     IsLastItem = true 
    }, 
    new Item 
    { 
     Id = 14, 
     ParentId = 11, 
     Content = "item14", 
     IsLastItem = true 
    } 
}; 
+3

Если вы хотите использовать данные как структуру дерева, то почему бы на самом деле не использовать древовидную структуру вместо списка? –

+0

@BlakeThingstad: Я получаю эту модель из базы данных. Вот почему у меня это как плоская модель. –

+0

Если эти данные широко используются, возможно, стоит рассмотреть возможность превращения его в древовидную структуру. Это, по крайней мере, стоит посмотреть. Вот один из примеров, который я нашел с помощью быстрого поиска: [Flat Data to Hierarchical Model] (http://stackoverflow.com/questions/26949442/flat-data-to-hierarchical-model-c-sharp) –

ответ

1

Вам нужно рекурсивный метод

// Start finding the base item to start the recursive search 
Item x = items.Where(i => i.Id == 9).FirstOrDefault(); 
List<Item> found = Search(items, x); 

// Insert the starting item at the first position (Add is also good but...) 
found.Insert(0, x); 



public List<Item> Search(List<Item> list, Item parent) 
{ 
    // Prepare the list to return... 
    List<Item> found = new List<Item>(); 
    if (parent != null) 
    { 
     // Search all the items that have the parent passed 
     List<Item> temp = list.Where(x => x.ParentId == parent.Id).ToList(); 
     // Add the list to the return variable 
     found.AddRange(temp); 
     // For each child of this parent look for their childs 
     foreach(Item x in temp) 
      found.AddRange(Search(list, x)); 
    } 
    return found; 
} 
0

вы можете использовать LINQ, что-то вроде ниже поможет вам начать ...

var parent = items.First(x => x.Content == "item9"); 
var children = items.Where(x => x.Id == parent.Id); 
+1

Обратите внимание, что это было бы найти своих прямых детей, а не детей своих детей. – Foggzie

+0

@GuntherFox верен, я пропустил эту часть графика. Чтобы получить детей детей, вам нужно будет внедрить рекурсивный метод. Похоже, что модель базы данных может быть обновлена ​​для использования свойств навигации и '.Include()', чтобы сделать это проще. –