2015-06-18 3 views
0
var boughtApples = apples.GroupBy(x => BoughtById); 
var boughtCoconuts = coconuts.GroupBy(x => x.BoughtById); 
var boughtOranges = oranges.GroupBy(x => x.BoughtById); 

Я хочу, чтобы получить ключевые ценности BoughtById, которые купили все три предмета, а затем удалить их, если из всех IGroupings если гавань»купила все три.Проверьте значение ключа существует в несколько IGrouping и удалить, если они не

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

ВЫВОД

boughtApples = [4] 
boughtCoconuts = [4] 
boughtOranges = [4] 
+3

'IGrouping' является только для чтения API. Вы не можете * удалить * что угодно. Вы можете создать новую коллекцию значений, которые находятся во всех трех группах, если хотите. – Servy

ответ

1

Чтобы просто получить BoughtById, которое в каждом вы хотите пересечение трех наборов ключей:

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

купилAll теперь будет IEnumerable<int> или IQueryable<int>, если необходимо.

Чтобы затем получить соответствующие группы, которые вы хотите фильтровать на этом перекрестке:

boughtApples = boughtApples.Where(grp => boughtAll.Contains(grp.Key)); 
boughtCoconuts = boughtCoconuts.Where(grp => boughtAll.Contains(grp.Key)); 
boughtOranges= boughtOranges.Where(grp => boughtAll.Contains(grp.Key)); 
1

Похоже, работа для Enumerable.Intersect():

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

IEnumerable<int> both = id1.Intersect(id2); 

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

/* 
    This code produces the following output: 

    26 
    30 
*/ 

 Смежные вопросы

  • Нет связанных вопросов^_^