Проверьте, не разделены ли списки - PullRequest
0 голосов
/ 07 июня 2018

Мне нужно проверить, имеют ли два списка какие-либо общие элементы. Мне просто нужно да / нет - мне не нужен фактический список общих элементов.

Я мог бы использовать Enumerable.Intersect(), но на самом деле это возвращает набор подходящих элементов, который кажетсякак это потребует дополнительных накладных расходов. Есть ли лучший способ проверить, не являются ли списки непересекающимися?


На самом деле мои списки действительно List<T>, но это не важно, и я мог бы использовать что-то вроде HashSet (скажем), если бы это было более удобно.то есть я не хочу излишне ограничивать потенциальные решения.

Grazie mille

1 Ответ

0 голосов
/ 07 июня 2018

Простейшая версия (с использованием Intersect):

 public bool Compare(List<T> firstCollection, List<T> secondCollection)
 {
    return firstCollection.Intersect(secondCollection).Any();
 }

Единственное предупреждение: либо T должно реализовывать IEquatable<T>, либо передавать пользовательский IEqualityComparer<T> в вызове Intersect.Также убедитесь, что GetHashCode переопределено вместе с Equals

Edit 1:

Эта версия, использующая словарь, не только обеспечивает сравнение 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);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...