2010-04-09 3 views
1

Considérez ce bout de code:En comparant plusieurs propriétés d'entité contre liste des entités

var iList = new List<Entities.Ingredient> 
{ 
    new Entities.Ingredient { Name = "tomato", Amount = 2.0 }, 
    new Entities.Ingredient { Name = "cheese", Amount = 100.0 } 
}; 


var matches = new DataContext().Ingredients.Where(i => Comparer(i, iList)); 


private Boolean Comparer(Entities.Ingredient i, List<Entities.Ingredient> iList) 
{ 
    foreach (var c in iList) 
    { 
     if (c.Name == iList.Name && c.Amount >= iList.Amount) return true; 
    } 

    return false; 
} 

est-il un moyen plus efficace de le faire? De préférence sans étant trop verbeux; de x dans y sélectionnez z ... Si c'est possible.

+0

Vous avez une erreur dans votre fonction Comparer: la variable 'I' est utilisé dans la boucle comme paramètre ans de la fonction. –

+0

Merci. Mais c'est un pseudo-code. L'implémentation réelle compile :) – roosteronacid

Répondre

2

Vous pouvez implémenter l'interface IComparable sur votre classe (Ingredient). De cette façon, vous garderez au moins le code de comparaison intégré dans la classe sans avoir besoin de la méthode supplémentaire.
Voici un lien:
http://www.c-sharpcorner.com/UploadFile/prasadh/IComparablePSD12062005010125AM/IComparablePSD.aspx

+0

Mais alors je devrais ré-implémenter cette interface chaque fois que je changerais mon fichier dbml (glisser 'n drop LINQ to SQL). – roosteronacid

+0

... Ou simplement implémenter l'interface dans une classe partielle. Génial! :) – roosteronacid

+0

Oui, cela fonctionne. L'alternative serait d'utiliser un IEqualityComparer externe , mais la solution "classe partielle avec interface" est plus élégante. –

Questions connexes