繁体   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