c# LINQ фильтр вложенной коллекции - PullRequest
0 голосов
/ 22 апреля 2020

У меня следующая иерархия классов:

public class URecordFieldEmr
{
   public Guid Key { get; set; }
   public string Alias { get; set; }
   public List<Value> Values { get; set; }
}

public class Value
{
    public int Index { get; set; }
    public List<DayOfWeek> DaysOfWeek { get; set; } 
}

Мне нужно отфильтровать List<URecordFieldEmr> по дням недели, поэтому я пытаюсь так:

var filtredExercises = uRecordFields
                         .Where(f => f.Values.Any(v => v.DaysOfWeek.Contains(dayOfWeek)))
                         .ToList();

Но в в этом случае, если у меня есть два Value s: первое значение - DaysOfWeek - воскресенье, второе значение - понедельник, и когда я пытаюсь фильтровать по воскресеньям, я получаю оба этих значения. Но мне нужны значения, которые содержат указанный c день недели.

PS dayOfWeek is. NET enum

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Вопрос в том, почему у вас даже есть List of dayofweek в значениях класса, если совпадение может быть только один день недели? Не должно ли значение тогда просто выглядеть следующим образом?

public class Value
{
    public int Index { get; set; }
    public DayOfWeek d { get; set; } 
}

Или вы также хотите проверить, содержит ли List<DayOfWeek> DaysOfWeek ту же самую комбинацию, с которой вы хотите сравнить, например, понедельник и воскресенье? тогда список должен содержать ровно и только понедельник и воскресенье? Или в среду, пятницу и четверг, тогда список должен содержать только эти значения, и все 3 должны присутствовать?

В любом случае, в случае, если вам нужно сравнить только одну запись, и она должна быть единственной в списке список (как вы это описали), либо переписать класс значений, как описано выше. Или вы можете проверить это так:

var filtredExercises = uRecordFields
                         .Where(f => f.Values.Any( v => v.DaysOfWeek.count = 1 && v.DaysOfWeek.FirstOrDefault() == dayofweek))
                         .ToList();

Может быть, этот подход более читабелен. Кроме того, вы могли бы добавить метод Different () перед firstordefault (), если ваш класс допускает несколько записей в один и тот же день.

Вы также можете создать метод для значений класса, который выполняет проверку для вас, и затем вы вызываете этот метод. в лямбде. Но это зависит, если естественная ответственность за проверку лежит на самом классе.

0 голосов
/ 22 апреля 2020

Я полагаю, вам нужно отфильтровать совпадающее свойство Values, верно? Если это так, то приведенный ниже запрос может помочь

var result = uRecordFields.Select(x => new URecordFieldEmr
{
    Values = x.Values.Where(y => y.DaysOfWeek.Any(z => z == DayOfWeek.Sunday)).ToList(),
    Alias = x.Alias,
    Key = x.Key
}).Where(x => x.Values != null && x.Values.Count != 0).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...