检查列表是否不相交

时间:2018-06-07 13:24:28

标签: c# disjoint-sets

我需要检查两个列表是否有任何共同的元素。 我只需要一个是/否 - 我不需要实际的常用元素列表。

我可以使用Enumerable.Intersect()但这实际上会返回匹配项的集合,这似乎需要额外的开销。 有没有更好的方法来检查列表是否不相交?

我的列表实际上恰好是List<T>,但这并不重要,如果更方便,我可以使用像HashSet这样的东西。即,我不想不必要地限制潜在的解决方案。

Grazie mille

1 个答案:

答案 0 :(得分:1)

  

最简单的版本(使用Intersect):

void matrix_x_vector_new(int n1,
                         int n2,
                         int vector[3],
                         int matrix[2][3],
                         int result_vector[3])
{
    int i, j; // i = row; j = column;
    printf("\nProduct Matrix of [x]*[y]\n");
    // Load up A[n][n]
    for (i = 0; i<n2; i++)
    {
        for (j = 0; j<n1; j++)
        {
            result_vector[j] += matrix[j][i] * vector[i];
            printf("%4i", result_vector[j]);
        }
        printf("\n");
    }
    printf("Vector: \n");
    // Print Vector from Product[n][n]
    for (i = 0; i<n1; i++)
    {
        printf("%4i\n", result_vector[i]);
    }
}

只有警告 public bool Compare(List<T> firstCollection, List<T> secondCollection) { return firstCollection.Intersect(secondCollection).Any(); } 才能在T电话中实施IEquatable<T>或传递自定义IEqualityComparer<T>。另外,请确保IntersectGetHashCode

一起被覆盖

修改1:

使用Dictionary的这个版本不仅提供Equals比较,还提供元素。在此解决方案中,boolean最后将包含与交叉元素数量相关的数据,其中一个集合中的元素数量,而不是另一个集合中的元素数量,因此相当持久。此解决方案还具有Dictionary要求

IEquatable<T>