簡體   English   中英

c# LINQ 過濾器嵌套集合

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM