2010-06-14 6 views
0

J'ai un objet Project qui a un certain nombre de champs, dont l'un est Name. J'ai une feuille de calcul de projets qui contient certains de ces champs, et une autre qui contient le reste. Toutefois, les deux feuilles de calcul ont le champ Name.Fusionner deux listes d'objets qui contiennent des données différentes

Je les ai lus et rempli deux List<Project>, remplissant seulement les champs disponibles de cette source particulière. Par exemple. un projet de liste 1 ressemble à:

{Name="MyProj", Type="Form", Priority=NULL} 

Alors qu'un projet de liste 2:

{Name="MyProj", Type=NULL, Priority="High"} 

Maintenant, je veux fusionner ces deux listes en une seule dans laquelle chaque objet du projet a tous ses domaines rempli, avec le champ Nom utilisé pour faire correspondre les éléments.

Comment puis-je y parvenir? Y a-t-il de bons moyens de le faire de manière concise?

Merci

Répondre

3

J'utiliseraient probablement l'opérateur ?? pour trouver les valeurs. Un dictionnaire pourrait être utile.

// put one into a dict for faster access 
var dict2 = list2.ToDictionaty(x => x.Name, x); 

// merge the lists using ?? 
var merged = list1.Select(x => 
{ 
    var p2 = dict2[x.Name]; 
    return new Project() 
    { 
     Name = x.Name, 
     Type = x.Type ?? p2.Type, 
     Priority = x.Priority ?? p2.Priority 
    } 
}); 

Ou

var merged = list1 
    // join the lists by the name 
    .Join(list2, x => x.Name, x => x.Name, (p1, p2) => new { P1 = p1, P2 = p2 }) 
    .Select(x => 
    new Project() 
    { 
     Name = P1.Name, 
     Type = P1.Type ?? P2.Type, 
     Priority = P1.Priority ?? P2.Priority 
    }); 

Il y a des centaines de variantes. Vous pouvez uniquement joindre et traiter le résultat dans un foreach pour fusionner les données d'une liste dans l'autre. Etc

Cela devient plus compliqué quand les projets peuvent manquer dans l'une des listes, et encore plus compliqué si aucune liste n'est complète. Ensuite, il pourrait être utile de créer une liste complète des noms de projets au début.

+0

Super, merci pour les suggestions. J'ai pris le premier échantillon pour fonder le mien. –

Questions connexes