Использование лямбда-выражения LINQ, определяющего значение по группе by и условию where

#c# #linq #lambda

#c# #linq #лямбда

Вопрос:

Итак, у меня есть следующая таблица данных:

 Region      Class
Reg100      A
Reg100      B
Reg200      A
Reg300      B  
  

Где я хочу определить область, которая имеет два класса A и B. В этом случае это будет Reg100. Как я мог бы написать это с помощью лямбда-выражения?

Я пробовал что-то вроде приведенного ниже, но не получил того, что хотел.

 dt.Where(x => x.Class.Contains(listOfAandB).GroupBy(x=>x.Region).FirstOrDefault()
  

Ответ №1:

Давайте определим входные данные:

 class Data
{
    public string Region;
    public string Class;
}

var dt = new[] 
{ 
    new Data { Region = "Reg100", Class = "A" },
    new Data { Region = "Reg100", Class = "B" },
    new Data { Region = "Reg200", Class = "A" },
    new Data { Region = "Reg300", Class = "B" },
};
  

Теперь, используя GroupBy , мы можем сгруппировать входные данные по регионам.

 dt.GroupBy(x => x.Region)
  

Это дает { Reg100 (A, B), Reg200 A, Reg 300 B } . Теперь посмотрим, сможем ли мы найти как A, так и B:

 dt.GroupBy(x => x.Region)
    .Where(g => g.Any(x => x.Class == "A") amp;amp; g.Any(x => x.Class == "B"))
  

И, наконец, поскольку нас интересует только регион, мы проецируем на него:

 dt.GroupBy(x => x.Region)
    .Where(g => g.Any(x => x.Class == "A") amp;amp; g.Any(x => x.Class == "B"))
    .Select(g => g.Key);