Вот один из способов реализации условного агрегирования с использованием linq.
Обратите внимание, что мне пришлось немного подправить ваше состояние, потому что вы написали size=M or color=blue or size<40
- но размер - это либо строка, либо число, на самом деле не может быть и тем и другим - поэтому я решил, что это опечатка, и предполагалось, быть size=M or color=blue or value<40
.
Кроме того, поскольку вы не предоставили MCVE , я сделал это для вас ( Пожалуйста попробуйте создать MCVE для ваших следующих вопросов)
Итак, давайте начнем с простого класса для данных:
class Data
{
public Data(string id, string size, int value, string color)
{
Id = id;
Size = size;
Color = color;
Value = value;
}
public string Id {get;set;}
public string Size {get;set;}
public int Value {get;set;}
public string Color {get;set;}
public override string ToString()
{
return string.Format("Id = {0}, Size = {1}, Value = {2}, Color = {3}", Id, Size, Value, Color);
}
}
Теперь давайте создадим список этого класса и наполним его примерами данных, которые вы (вроде) предоставили:
var sampleData = new List<Data>()
{
new Data("Id1", "L", 35, "red"),
new Data("Id2", "L", 65, "blue"),
new Data("Id3", "M", 34, "blue"),
new Data("Id4", "S", 32, "blue"),
new Data("Id5", "S", 55, "green")
};
Поскольку я не хотел писать условия дважды, я решил сначала выбрать новый анонимный тип, который содержит класс Data и другое свойство, которое я назвал ConditionsMatched
, для хранения количества условий, на которых эти данные фактически выполняются. Матчи.
Тогда все, что мне нужно было сделать, это отфильтровать результат этого select
, чтобы он возвращал только те случаи, когда ConditionsMatched
больше 0
:
var result = sampleData
.Select(d => new
{
Data = d,
ConditionsMatched =
(d.Size == "M" ? 1 : 0) +
(d.Color == "blue" ? 1 : 0) +
(d.Value < 40 ? 1 : 0)
})
.Where(a => a.ConditionsMatched > 0);
Результатом является IEnumerable<AnonymousType>
, который содержит только данные, которые соответствуют хотя бы одному условию.
Вы можете увидеть живое демо на rextester.