簡體   English   中英

需要幫助來制作優雅的LINQ查詢

[英]Need help crafting an elegant LINQ query

我有一個名為WaferMap的對象,其中包含藍帶列表。 每個藍帶都包含一個模版列表,每個模版都有一​​個名稱。 我需要能夠從bluetape列表中提取其模版,如果它不存在,我需要它返回null,而不會使應用程序崩潰。

總結層次結構:

WaferMap has a List<BlueTape>
BlueTape has a List<DiePrint>
DiePrint has name (of type string)

這是我到目前為止的內容:

    print = waferMap.BluetapeList
                    .Select(x => x.DiePrintList)
                    .First(x => x.Contains(print, new DiePrint.Comparer()))
                    .First(x => x.Name == print.Name);

這是DiePrint類的比較器對象:

    public class Comparer : IEqualityComparer<DiePrint>
    {
        public bool Equals(DiePrint x, DiePrint y) { return x.Name == y.Name; }
        public int GetHashCode(DiePrint obj) { return obj.Name.GetHashCode(); }
    }

現在,由於某種原因,它總是找到匹配項,即使在任何藍帶沖印列表中都沒有使用適當名稱的沖印也是如此。

waferMap.BluetapeList
        .SelectMany(bt => bt.DiePrintList)
        .FirstOrDefault(dp => dp.Name == print.Name);

SelectMany展平列表(docs)

您的解決方案可能就像在比較器的Equals方法中檢查null一樣容易。

public bool Equals(DiePrint x, DiePrint y)
{
    if (x == null && y == null)
    {
        return true;
    }
    else if (x == null || y == null) 
    {
        return false;
    }
    else
    {
        return x.Name == y.Name;
    }
}

那是“當什么為空時它會使程序崩潰”的第一個地方。 如果仍然無法解決問題,那么我們將需要更多詳細信息。

只需使用SelectMany展平每個集合,過濾所需的內容,並使用FirstOrDefault獲取第一項,但如果沒有返回該類型的默認值(在這種情況下為null),則使用默認值。

var query = from wafer in wafers
    from tape in wafer.Tapes
    from die in tape
    where die.Name == print.Name
    select tape;

var firstTape = query.FirstOrDefault();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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