LINQ: Comment faire pour convertir la imbriquée hiérarchique objet d'aplatir l'objet
Comment convertir le imbriquée hiérarchique objet pour aplatir les objets à l'aide de LINQ? Je sais que nous pouvons facilement utiliser une boucle foreach pour y parvenir. Mais je me demandais si il y a une façon de l'écrire dans LINQ.
class Person{
public int ID {get;set}
public string Name {get;set}
public List<Person> Children {get;}
}
De données :
ID : 1
Name : Jack
Children
2 | Rose
3 | Paul
Je voudrais convertir ces données dans aplatir format comme ci-dessous.
1 | Jack
2 | Rose
3 | Paul
Comment pouvons-nous faire avec Linq?
OriginalL'auteur Michael Sync | 2009-12-21
Vous devez vous connecter pour publier un commentaire.
Si vous voulez aplatir arbitrairement une profondeur de l'arbre de personnes, je suggère ce qui suit:
Il n'y a pas vraiment un bon moyen de raccourcir ce avec LINQ, car anonyme lambda ne peut pas s'appeler récursivement sans la mise en œuvre de Y. Vous pourrait "réduire" la méthode ci-dessus pour
ou sinon
mais qui semble en quelque sorte inutile pour moi.
Func<int, int> fib = null; fib = i => i <= 1 ? i : fib(i-1) + fib(i-2);
J'ai dit "anonyme lambdas ne peux pas les appeler eux-mêmes", c'est pourquoi il ne peut pas écrire une seule expression qui renvoie la valeur qu'il veut -- il doit déclarer un nom de fonction de manière récursive.
Donc en les mettant quelque chose d'anonyme dans une variable, il n'est plus anonyme? E. g.
var a = new { X = 5 };
? J'avais toujours appeler cea
fait référence à un type anonyme. Microsoft inconditionnellement dit que "Une expression lambda est une fonction anonyme" et de regarder le deuxième exemple de les Méthodes Anonymes. Presque tout anonymes se doit d'être mis dans une sorte de variable nommée ou d'un paramètre; autrement, ils ne sont pas utilisables par le code. Cela ne veut pas dire qu'ils ne sont pas anonymes.Je vais continuer d'utiliser le mot "anonyme" pour dire "pas identifiés par leur nom." Dans votre exemple, le type est anonyme, mais l'objet n'est pas anonyme.
Vous êtes juste en utilisant des mots d'une façon que je ne pense pas qu'est le langage commun. Je fais appel à la page Wikipédia: en.wikipedia.org/wiki/Anonymous_function "Dans le langage de programmation théorie, une fonction anonyme (également fonction constante, fonction littérale, ou d'une fonction lambda) est une fonction (ou d'un sous-programme défini, et probablement appelé, sans être lié à un identifiant." en Disant: "les objets n'ont pas de noms" n'est pas la façon de prendre soin d'utiliser le mot "nom", nous allons donc rester en désaccord à ce sujet.
OriginalL'auteur
C'est une bonne, générique et réutilisable méthode d'extension:
Dans le cas ci-dessus, procédez comme ceci:
Un mineur nit, c'est qu'il ne comprend pas le parent d'origine dans la liste, vous aurez besoin de le faire.
OriginalL'auteur