2013-05-03 2 views
0

Привет У меня есть список так:LINQ Получить Сгруппированные ID по условию

 
A 1 
A 2 
A 3 
A 4 
B 1 
B 2 
C 1 

Я хочу, чтобы выбрать букву, которая содержит по крайней мере эти 3 цифры: 1,2,3

Так что в этом случае будет выбрана буква A.

Можете ли вы помочь мне написать это как выражение LINQ?

Большое спасибо!

ответ

1

Сначала создайте коллекцию нужных вам номеров.

var required = new[] { 1, 2, 3 }; 

Затем группируйте свои пары письмами.

var groupedPairings = pairings.GroupBy(p => Letter, p => Number); 

Затем отбросьте те пары, у которых нет трех необходимых предметов. (Логика здесь «взять сбор необходимых предметов, удалить что-либо в группе, и убедитесь, что не осталось ничего».)

var groupsWithRequired = groupedPairings 
    .Where(g => !required.Except(g).Any()); 

Теперь, если вы просто хотите, чтобы письма, вы можете просто сделать

var lettersWithRequired = groupsWithRequired.Select(g => g.Key); 

или если вы хотите словарь отображения из письма к своей коллекции чисел, вы можете сделать

var dictionary = groupsWithRequired.ToDictionary(g => g.Key, g => g.ToArray()); 
var numbersForA = dictionary["A"]; // = {1, 2, 3, 4} 
0

вы могли бы попробовать это, хотя я не чувствую, что это лучший ответ:

var items = new List<Item>{ 
    new Item{Name="A", Value=1}, 
    new Item{Name="A", Value=2}, 
    new Item{Name="A", Value=3}, 
    new Item{Name="A", Value=3}, 
    new Item{Name="A", Value=4}, 
    new Item{Name="B", Value=1}, 
    new Item{Name="B", Value=2}, 
    new Item{Name="C", Value=1}, 
}; 

var values = new List<int>{1,2,3}; 

var query = items.GroupBy (i => i.Name) 
       .Where (i => i.Select (x => x.Value) 
           .Intersect(values).Count() == values.Count) 
       .Select (i => i.Key); 

Где

class Item{ 
    public string Name{get;set;} 
    public int Value{get;set;} 
} 
Смежные вопросы