我有一个名为waferMap的对象,它包含蓝猿列表;每个蓝猿包含一个模具打印列表,每个模具打印都有一个名称。我需要能够从蓝带列表中提取基于其名称的模具打印,如果它不存在,我需要它返回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(); }
}现在,由于某种原因,它总是找到匹配的,即使在任何一个蓝猿模具打印列表中没有带有适当名称的模具打印。
发布于 2015-05-28 17:29:37
waferMap.BluetapeList
.SelectMany(bt => bt.DiePrintList)
.FirstOrDefault(dp => dp.Name == print.Name);SelectMany平坦列表(docs)。
发布于 2015-05-28 17:28:11
您的解决方案可能与在比较器的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;
}
}这是“当某物为空时,程序就会崩溃”的第一个地方。如果这仍然不起作用,那么我们需要更多的细节。
发布于 2015-05-28 17:30:07
只需使用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();https://stackoverflow.com/questions/30513201
复制相似问题