[英]c# LINQ filter nested collection
我有下一個 class 層次結構:
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
:第一個值 - DaysOfWeek
- 星期日,第二個值 - 星期一,當我嘗試按星期天過濾時,我得到這兩個值。 但我需要包含特定星期幾的值。
PS dayOfWeek 是 .NET 枚舉
問題是,如果匹配只能是精確的一周,為什么你甚至在 class 值中有一個星期列表? 那么價值不應該看起來像這樣嗎?
public class Value
{
public int Index { get; set; }
public DayOfWeek d { get; set; }
}
或者您是否還希望能夠檢查List<DayOfWeek> DaysOfWeek
是否包含與您想要比較的完全相同的組合,例如周一和周日,那么列表需要准確且僅包含周一和周日? 或者周三、周五和周四,那么列表只必須包含這些值並且所有 3 個都需要存在?
無論如何,如果您只需要比較一個條目並且它應該是列表中的唯一條目(如您所描述的那樣),請如上所述重寫值 class 。 或者你可以像這樣檢查它:
var filtredExercises = uRecordFields
.Where(f => f.Values.Any( v => v.DaysOfWeek.count = 1 && v.DaysOfWeek.FirstOrDefault() == dayofweek))
.ToList();
也許這種方法更具可讀性。 如果您的 class 允許同一天的多個條目,您也可以在 firstordefault() 之前添加 distinct()。
您還可以對 class 值執行一個方法來為您進行檢查,然后在 lambda 中調用該方法。 但這取決於檢查的自然責任是否在 class 本身。
我假設的是,您需要過濾匹配的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();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.