2 votes

LINQ filtre la liste par collection imbriquée

J'ai la hiérarchie de classe suivante :

public class SportPlan
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<Record> RecordFields { get; set; }
}

public class Record
{
    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; }
}

Je dois filtrer SportPlan.RecordFields par dayOfWeek (.NET enum)et obtenir une liste de Value en utilisant LINQ. J'ai essayé quelque chose comme ça mais ça ne fonctionne pas :

var filtredExercises = SportPlan.RecordFields.Select(x => x.Values.Where(v => v.DaysOfWeek.Equals(dayOfWeek))).ToList();

5voto

germi Points 3423

Au lieu de Select vous devez utiliser Where pour filtrer votre liste. Quelque chose comme ceci devrait être proche de ce que vous voulez :

var filteredExercises = SportPlan.RecordFields
                                 .Where(f => f.Values.Any(v => v.DaysOfWeek.Contains(dayOfWeek)))
                                 .ToList();

Cela vous donnerait tous Record qui ont un Value donde DaysOfWeek contient le dayOfWeek que vous recherchez.

Si, au lieu de cela, vous avez besoin du Value vous pourriez utiliser quelque chose comme ceci :

var filteredExercises = SportPlan.RecordFields
                             .SelectMany(f => f.Values)
                             .Where(v => v.DaysOfWeek.Contains(dayOfWeek))
                             .ToList();

Avec SelectMany nous aplatissons d'abord la liste des listes de Value à un IEnumerable<Value> et ensuite filtrer cela en utilisant le dayOfWeek .

0voto

Ömür Buruk Points 11

Vous pouvez essayer ceci :

var filtredExercises = SportPlan.RecordFields.Select(x => x.Values.Where(v => v.DaysOfWeek.Equals(dayOfWeek)).Length > 0 ).ToList();

0voto

Nsevens Points 665

Si vous voulez faire correspondre n'importe quel élément existant dans la liste des jours de la semaine, essayez ceci :

var filtredExercises = SportPlan.RecordFields.Select(x => x.Values.Where(v => v.DaysOfWeek.And(d => d.Equals(dayOfWeek)))).ToList();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X