我正在获取线段的集合并修剪所有重叠的线段,我应该得到一个不重叠的集合作为输出。
为了测试我的输出,我想遍历集合中的每个项目并确保它不与任何其他项目重叠。
目前我有这段代码:
foreach (var assay in compiledAssays)
{
if (compiledAssays.Where(a => a != assay).Any(a => a.Overlaps(assay)))
{
throw new ApplicationException("Something went wrong.");
}
}
它是可读的,但对我来说“味道不好”。似乎它会迭代集合至少三次以进行测试。
是否有更好的表达方式?
最佳答案
嗯,合并 Where
和 Any
子句将是一个很好的第一个改进:
foreach (var assay in compiledAssays)
{
if (compiledAssays.Any(a => a != assay && a.Overlaps(assay)))
{
throw new ApplicationException("Something went wrong.");
}
}
你也可以试试更简洁的:
if (compiledAssays.Any(a => compiledAssays.Any(b => a != b && a.Overlaps(b))))
{
throw new ApplicationException("Something went wrong."");
}
否则,如果您最关心的是尽量减少执行的循环次数,我就不会使用 Linq。我会这样做(假设 compiledAssays
是一个数组,根据需要进行调整):
for (int i = 0; i < compiledAssays.Length; i++)
{
for (int j = i + 1; j < compiledAssays.Length; j++)
{
if (compiledAssays[i].Overlaps(compiledAssays[j]))
{
throw new ApplicationException("Something went wrong.");
}
}
}
编辑: Raymond Chen 非常中肯的评论。
我的最后一个选项假设 Overlaps
函数是对称的。
换句话说,a.Overlaps(b)
将始终返回与 b.Overlaps(a)
相同的值。如果不是这种情况,那么我最后的选择是不正确的。
关于c# - 检查集合中的项目是否与任何其他项目匹配的 Linq 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31600930/