2010-06-07 8 views
0

j'ai deux colluectionsDéfinition d'une propriété d'une collection à une autre collection

List<Application> myApps; 

List<Application> yourApps; 

Ces listes ont chevauchement des données qui se chevauchent, mais ils viennent de sources différentes et chaque source des données manquantes sur le terrain.

application objet possède une propriété appelée Description de

Les deux collections ont un champ unique appelé Key

je veux voir s'il y a une solution LINQ à:

boucle à travers toutes les applications myApps et regardez la clé et voir si cela existe dans votre Applications. Si elle le fait, je veux prendre la Description propriété de cette application dans YourApps et définissez la propriété de description de l'application sur MyApps à cette même valeur

je voulais voir s'il y avait une façon lisse en utilisant lambda expressions (au lieu de devoir avoir des boucles et un certain nombre d'instructions if.)

Répondre

2

Vous pouvez utiliser une jointure:

foreach(var pair in from m in myApps 
        join y in yourApps on m.Key equals y.Key 
        select new { m, y }) { 
    pair.m.Description = pair.y.Description; 
} 
+0

+1 wow, c'est bon LINQ mec! – VoodooChild

+0

cela ne compile pas. La paire n'est jamais utilisée et m et y ne sont pas reconnus sur la dernière ligne. Je pense que la dernière ligne devrait être pair.m.Description = pair.y.Description – leora

+1

@ooo ... correct. C'est une solution simple, j'espère que cela ne me dérange pas si je le mets dedans. –

0

Si vous avez une propriété Key dans votre classe Application et que vous effectuerez fréquemment ces types d'opérations, vous pouvez envisager d'utiliser un Dictionnaire au lieu d'une liste. Cela vous permettra d'accéder rapidement aux applications par clé.

Vous pouvez alors faire:

foreach(var app in myApps) 
{ 
    Application yourApp; 
    if (yourApps.TryGetValue(app.Key, out yourApp) 
     yourApp.Description = app.Value.Description; 
} 

Sinon, a join est probablement votre meilleure option.

1
var matchingApps = from myApp in myApps 
        join yourApp in yourApps 
        on myApp.Key equals yourApp.Key 
        select new { myApp, yourApp }; 

foreach (var pair in matchingApps) 
{ 
    pair.myApp.Description = pair.yourApp.Description; 
} 

Votre question posée pour "sang-froid lambda", mais pour les jointures, je trouve la syntaxe d'expression de requête beaucoup plus claire. Cependant, la version lambda de la requête est ci-dessous.

Version Lambda:

var matchingApps = myApps.Join(yourApps, myApp => myApp.Key, yourApp => yourApp.Key, (myApp, yourApp) => new { myApp, yourApp }); 
0

Je pense:

 foreach (var item in myApps) 
     { 
      var desc = yourApps.FirstOrDefault(app => app.Key == item.Key); 
      if (desc != null) 
      { 
       item.description = desc.description; 
      } 
     } 

il y a encore forloop là il pourrait ne pas être ce que vous vouloir, mais toujours mes 2 cents ...

:)

0

Pourquoi pas simplement (ceci va créer une copie de l'énumérable):

myApps.Join(yourApps, 
      m => m.Key, 
      y => y.Key, 
      (m, y) => new { m, y.description }) 
     .ToList() 
     .ForEach(c => c.m.description = c.description); 
Questions connexes