#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);