Vérifiez si la valeur de clé existe dans plusieurs groupes IG et supprimez s'ils ne le sont pas

var boughtApples = apples.GroupBy(x => BoughtById);
var boughtCoconuts = coconuts.GroupBy(x => x.BoughtById);
var boughtOranges  = oranges.GroupBy(x => x.BoughtById);

Je veux obtenir les valeurs de clé BoughtById qui ont acheté les trois éléments et les supprimer si de tous les IGroupings si le havre 'a acheté tous les trois.

boughtApples   = [1,3,4,5]
boughtCoconuts = [1,2,4,9]
boughtOranges  = [6,3,4,10]

SORTIE

boughtApples   = [4]
boughtCoconuts = [4]
boughtOranges  = [4]
0
IGrouping est une API en lecture seule. Vous ne pouvez pas supprimer quoi que ce soit. Vous pouvez créer une nouvelle collection des valeurs qui sont dans les trois groupes, si vous le souhaitez.
ajouté l'auteur Servy, source

2 Réponses

Cela ressemble à un travail pour Enumerable.Intersect() :

int[] id1 = { 44, 26, 92, 30, 71, 38 };
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 };

IEnumerable both = id1.Intersect(id2);

foreach (int id in both)
  Console.WriteLine(id);

/*
  This code produces the following output:

  26
  30
*/
0
ajouté

Pour obtenir simplement le BoughtById qui est dans chacun vous voulez l'intersection des trois ensembles de clés:

var boughtAll = boughtApples.Select(gr => gr.Key)
  .Intersect(boughtCoconuts.Select(gr => gr.Key))
  .Intersect(boughtOranges.Select(gr => gr.Key));

boughtAll will now be an IEnumerable or IQueryable as appropriate.

Pour obtenir ensuite les groupes correspondants que vous souhaitez filtrer en fonction de cette intersection:

boughtApples = boughtApples.Where(grp => boughtAll.Contains(grp.Key));
boughtCoconuts = boughtCoconuts.Where(grp => boughtAll.Contains(grp.Key));
boughtOranges= boughtOranges.Where(grp => boughtAll.Contains(grp.Key));
0
ajouté