为了账号安全,请及时绑定邮箱和手机立即绑定

检查列表是否不相交

检查列表是否不相交

C#
临摹微笑 2021-07-26 15:17:56
我需要检查两个列表是否有任何共同元素。我只需要是/否- 我不需要常见元素的实际列表。我可以使用,Enumerable.Intersect()但这实际上返回匹配项的集合,这似乎需要额外的开销。有没有更好的方法来检查列表是否不相交?我的列表确实碰巧是,List<T>但这并不重要,HashSet如果这样更方便的话,我可以使用类似(比如说)这样的东西。即,我不想不必要地限制潜在的解决方案。
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

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


 public bool Compare(List<T> firstCollection, List<T> secondCollection)

 {

    return firstCollection.Intersect(secondCollection).Any();

 }

唯一的警告是在调用中T实现IEquatable<T>或传递自定义。还要确保与IEqualityComparer<T>IntersectGetHashCodeEquals


编辑1:


这个使用 Dictionary 的版本不仅会提供boolean比较,还会提供元素。在这个解决方案Dictionary中,最终将包含与交叉元素数量相关的数据,其中一个集合中的元素数量而不是另一个集合中的元素数量,因此相当耐用。这个解决方案也有IEquatable<T>要求


public bool CompareUsingDictionary(IEnumerable<T> firstCollection, IEnumerable<T> secondCollection)

    {

        // Implementation needs overiding GetHashCode methods of the object base class in the compared type

        // Obviate initial test cases, if either collection equals null and other doesn't then return false. If both are null then return true.

        if (firstCollection == null && secondCollection != null)

            return false;

        if (firstCollection != null && secondCollection == null)

            return false;

        if (firstCollection == null && secondCollection == null)

            return true;


        // Create a dictionary with key as Hashcode and value as number of occurences

        var dictionary = new Dictionary<int, int>();


        // If the value exists in first list , increase its count

        foreach (T item in firstCollection)

        {

            // Get Hash for each item in the list

            int hash = item.GetHashCode();


            // If dictionary contains key then increment 

            if (dictionary.ContainsKey(hash))

            {

                dictionary[hash]++;

            }

            else

            {

                // Initialize he dictionary with value 1

                dictionary.Add(hash, 1);

            }

        }


        // If the value exists in second list , decrease its count

        foreach (T item in secondCollection)

        {

            // Get Hash for each item in the list

            int hash = item.GetHashCode();


            // If dictionary contains key then decrement

            if (dictionary.ContainsKey(hash))

            {

                dictionary[hash]--;

            }

            else

            {

                return false;

            }

        }


        // Check whether any value is 0

        return dictionary.Values.Any(numOfValues => numOfValues == 0);

    }



查看完整回答
反对 回复 2021-07-31
  • 1 回答
  • 0 关注
  • 173 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信