60 votes

Ajouter des éléments à

En fait, comment faire pour que je puisse faire quelque chose de similaire : CurrentCollection.Contains(...) sauf en vérifiant si la propriété de l'élément se trouve déjà dans la collection ?

public class Foo
{
    public Int32 bar;
}

ICollection<Foo> CurrentCollection;
ICollection<Foo> DownloadedItems;

//LINQ: Add any downloaded items where the bar Foo.bar is not already in the collection?

71voto

R. Martinho Fernandes Points 96873

Vous commencez par déterminer les éléments qui ne figurent pas encore dans la collection :

var newItems = DownloadedItems.Where(x => !CurrentCollection.Any(y => x.bar == y.bar));

Il suffit ensuite de les ajouter :

foreach(var item in newItems)
{
    CurrentCollection.Add(item);
}

Notez que la première opération peut avoir une complexité quadratique si la taille de DownloadedItems est proche de la taille de CurrentCollection . Si cela pose des problèmes (mesurez d'abord !), vous pouvez utiliser un HashSet pour ramener la complexité à un niveau linéaire :

// collect all existing values of the property bar
var existingValues = new HashSet<Foo>(from x in CurrentCollection select x.bar);
// pick items that have a property bar that doesn't exist yet
var newItems = DownloadedItems.Where(x => !existingValues.Contains(x.bar));
// Add them
foreach(var item in newItems)
{
    CurrentCollection.Add(item);
}

24voto

Yanga Points 1291

Y E :

I

CurrentCollection.AddRange(DownloadedItems.Except(CurrentCollection));

16voto

JumpingJezza Points 2608

U

CurrentCollection.AddRange(DownloadedItems.Where(x => !CurrentCollection.Any(y => y.bar== x.bar)));

5voto

hunter Points 33850

Vous pouvez appeler la Any et passer une valeur à comparer à n'importe quelle propriété du type d'objet dans la collection

 if (!CurrentCollection.Any(f => f.bar == someValue))
{
    // add item
}

une solution plus complète pourrait être :

 DownloadedItems.Where(d => !CurrentCollection.Any(c => c.bar == d.bar)).ToList()
    .ForEach(f => CurrentCollection.Add(f));

2voto

Khalil Liraqui Points 363

Une chose que vous pouvez faire, et je pense que c'est la manière la plus simple, est d'utiliser un HashSet au lieu d'une List, par défaut le HashSet n'ajoute pas de valeurs redondantes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X