需要帮助来制作优雅的LINQ查询

时间:2015-05-28 17:23:45

标签: c# .net linq list data-structures

我有一个名为waferMap的对象,其中包含bluetapes列表;每个bluetape都包含一个模具打印列表,每个模具打印都有一个名称。我需要能够从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(); }
    }

现在它总是因某种原因找到一个匹配,即使任何一个bluetapes模具打印列表中没有任何模具打印都有适当的名称。

3 个答案:

答案 0 :(得分:6)

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    <script type="text/javascript" src="file:///System/Library/WidgetResources/AppleClasses/AppleAnimator.js" charset="utf-8"></script>
    <script type="text/javascript" src="file:///System/Library/WidgetResources/AppleClasses/AppleButton.js" charset="utf-8"></script>
    <script type="text/javascript" src="file:///System/Library/WidgetResources/AppleClasses/AppleInfoButton.js" charset="utf-8"></script>
    <link rel="stylesheet" href="main.css">
    <script type="text/javascript" src="Parts/parts.js" charset="utf-8"></script>
    <script type="text/javascript" src="localizedStrings.js" charset="utf-8"></script>
    <script type="text/javascript" src="main.js" charset="utf-8"></script>
</head>
<body onload="load();" apple-part="com.apple.Dashcode.part.StackLayout">
    <div id="front">
        <input id="textField" type="text" name="" value="" class="apple-textfield apple-no-children" apple-part="com.apple.Dashcode.part.textfield">
    </div>
    <div id="back">
    </div>
</body>
</html>

SelectMany展开列表(docs)

答案 1 :(得分:0)

您的解决方案可能就像在比较器的Equals方法中检查空值一样简单。

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;
    }
}

这是第一个地方&#34;当某些事情为空时,它会使程序崩溃&#34;跳出来对我说。如果这仍然无效,那么我们需要更多细节。

答案 2 :(得分:0)

只需使用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();