2017-10-16 4 views
0

j'ai une entité:données hiérarchiques multi-niveaux de tri C#

public class Document 
{ 
    public int id; 
    public int? ParentId; 
    public string name; 
} 

et des données dans la base de données:

id | ParentId | name 
----------------------- 
1 |   | fruits 
2 |   | vegetables 
3 |  2  | tomatoes 
4 |  1  | apples 
5 |  4  | golden apples 
6 |  4  | red apples 

Ou, comme C#:

var documents = new[] 
{ 
    new Document() { id = 1, ParentId = null, name = "fruits" }, 
    new Document() { id = 2, ParentId = null, name = "vegetables" }, 
    new Document() { id = 3, ParentId = 2, name = "tomatoes" }, 
    new Document() { id = 4, ParentId = 1, name = "apples" }, 
    new Document() { id = 5, ParentId = 4, name = "golden apples" }, 
    new Document() { id = 6, ParentId = 4, name = "red apples" }, 
}; 

Je dois obtenir :

id | ParentId | name 
----------------------- 
1 |   | fruits 
4 |  1  | apples 
5 |  4  | golden apples 
6 |  4  | red apples 
2 |   | vegetables 
3 |  2  | tomatoes 

Comment puis-je trier rapidement les données hiérarchiques dans C#?

+1

Trier par quelle colonne? –

+1

Votre classe 'Document' ne peut pas représenter les données que vous avez fournies. 'ParentId' doit être' int? 'Ou vos données doivent avoir une valeur pour chaque ligne. Veuillez fournir vos données d'entrée en tant que code C# valide. – Enigmativity

+2

Oh, et votre classe def n'est pas valide C#. Vous devriez faire l'effort de rendre aussi facile que possible de répondre. – Enigmativity

Répondre

2

Ainsi, étant donné:

public class Document 
{ 
    public int id; 
    public int? ParentId; 
    public string name; 
} 

Et:

var documents = new[] 
{ 
    new Document() { id = 1, ParentId = null, name = "fruits" }, 
    new Document() { id = 2, ParentId = null, name = "vegetables" }, 
    new Document() { id = 3, ParentId = 2, name = "tomatoes" }, 
    new Document() { id = 4, ParentId = 1, name = "apples" }, 
    new Document() { id = 5, ParentId = 4, name = "golden apples" }, 
    new Document() { id = 6, ParentId = 4, name = "red apples" }, 
}; 

alors cette fonction:

var lookup = documents.ToLookup(x => x.ParentId); 

Func<int?, IEnumerable<Document>> heirarchySort = null; 
heirarchySort = pid => 
    lookup[pid].SelectMany(x => new[] { x }.Concat(heirarchySort(x.id))); 

IEnumerable<Document> sorted = heirarchySort(null); 

Il vous donne:

Sorted Documents