c# - 检查集合中的项目是否与任何其他项目匹配的 Linq 方法

标签 c# linq

我正在获取线段的集合并修剪所有重叠的线段,我应该得到一个不重叠的集合作为输出。

为了测试我的输出,我想遍历集合中的每个项目并确保它不与任何其他项目重叠。

目前我有这段代码:

foreach (var assay in compiledAssays)
{
    if (compiledAssays.Where(a => a != assay).Any(a => a.Overlaps(assay)))
    {
        throw new ApplicationException("Something went wrong.");
    }
}

它是可读的,但对我来说“味道不好”。似乎它会迭代集合至少三次以进行测试。

是否有更好的表达方式?

最佳答案

嗯,合并 WhereAny 子句将是一个很好的第一个改进:

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/

相关文章:

c# - 不支持 Linq-to-EF DateTime.ToLocalTime

c# - Selenium:有没有办法在整个页面中搜索给定的关键字?

c# - 如何为一对 3D 向量实现 GetHashCode

c# - LINQ to Entities 无法识别方法 'Int32 IndexOf(System.String, System.StringComparison)' 方法

c# - 如何使用 LINQ 更改多个对象中的相同属性?

c# - 使用 Linq 计算余弦和正弦

c# - 如何在 EF 中重用 where 子句

c# - 在 quartz EF6 中使用 DBContext

c# - 为什么静态构造函数没有任何参数?

Java UTF-8 字符串与 C# UTF-8 字符串不匹配