Как найти повторяющиеся ключи из списка ‹KeyValuePair‹ byte [], строка ›› fileHashList = new List ‹KeyValuePair‹ byte [], string ›› ();

У меня есть lsit типа List<KeyValuePair<byte[], string>> fileHashList = new List<KeyValuePair<byte[], string>>();

foreach (string entry in results)
{
    FileInfo fileInfo = new FileInfo(Path.Combine("DirectoryPath"), entry));
    using (var md5 = MD5.Create())
    {
        using (var stream = File.OpenRead(fileInfo.FullName))
        {
            var hash = md5.ComputeHash(stream);
            fileHashList.Add(new KeyValuePair<byte[], string>(hash, fileInfo.FullName)); 
        }
    }
}

Мне нужно найти все повторяющиеся ключи в этом списке.

Я пробовал это, но в моем случае не работает, Я получаю "Enumeration yielded no results", хотя у меня такие же ключи!

Сообщите мне, если нужны дополнительные данные Спасибо


person m_beta    schedule 24.09.2020    source источник
comment
это не имеет смысла .. поскольку byte [] сравниваются по ref   -  person Selvin    schedule 24.09.2020
comment
Потому что GroupBy использует компаратор по умолчанию и для массива байтов, который бесполезен, поскольку сравнивает хэш объекта, который отличается для массивов с одинаковым содержимым. См. дубликат. Почему в любом случае у вас в качестве ключа используется байтовый массив?   -  person CodeCaster    schedule 24.09.2020
comment
Пожалуйста, дайте мне знать, как мне действовать, я имею в виду, в каком направлении   -  person m_beta    schedule 24.09.2020
comment
Смотрите дубликаты, используйте .GroupBy(k => k.Key, StructuralComparisons.StructuralEqualityComparer).   -  person CodeCaster    schedule 24.09.2020
comment
var duplicates = fileHashList.GroupBy (x = ›x.Key) .Where (x =› x.Count () ›1) .ToList ();   -  person jdweng    schedule 24.09.2020
comment
@jdweng попробуйте прочитать вопрос и комментарии. Это вызовет компаратор проверки на равенство по умолчанию, который не даст одинаковый хэш для массивов с одинаковым содержимым. Этот код не группирует, все ключи будут указаны как разные.   -  person CodeCaster    schedule 24.09.2020
comment
@CodeCaster Так мне нужно обязательно переопределить метод GetHashCode() или достаточно просто переопределить метод Equals()? Также причина, по которой я использую массив байтов в качестве ключа, потому что это хэш-код, и я хочу проверить, совпадают ли несколько файлов или нет.   -  person m_beta    schedule 24.09.2020
comment
Вы не можете переопределить их для массива, вам нужно предоставить настраиваемый компаратор, см. Мой другой комментарий.   -  person CodeCaster    schedule 24.09.2020
comment
@CodeCaster Я использовал ваш другой комментарий, но получаю cannot convert from 'System.Collections.IEqualityComparer' to 'System.Collections.Generic.IEqualityComparer<byte[]>'   -  person m_beta    schedule 24.09.2020
comment
Да, это неправильно, извините. Быстрое решение все равно заключалось бы в создании настраиваемого компаратора, как в первом дублированном принятом ответе.   -  person CodeCaster    schedule 24.09.2020
comment
@CodeCaster Я создал собственный компаратор, но изо всех сил пытаюсь использовать его, как хочу. Мне нужно найти все дубликаты, как указано в вопросе   -  person m_beta    schedule 24.09.2020
comment
@CodeCaster Можете ли вы просто написать для меня строку использования в соответствии с моими потребностями, отмеченными в вашем дубликате   -  person m_beta    schedule 24.09.2020
comment
Позвольте нам продолжить это обсуждение в чате.   -  person m_beta    schedule 24.09.2020
comment
Нет, отредактируйте свой вопрос, чтобы показать, что у вас есть и почему это не работает. Также не помешает иметь минимально воспроизводимый пример, в котором вы инициализируете список некоторыми образцами данных.   -  person CodeCaster    schedule 24.09.2020
comment
Извините за беспокойство, последний вопрос с моей стороны. Я хотел бы получить все повторяющиеся записи (пара значений ключа), например: [0,1], [0,2], [0,3], поэтому, поскольку ключ дублируется, я хотел бы получить все эти 3 записи, а не просто one Ваш запрос получает только одну запись (только с ключом) Я хочу, чтобы все повторяющиеся записи с парой ключ-значение   -  person m_beta    schedule 24.09.2020
comment
@CodeCaster Я обновил свой вопрос, как вы просили. Пожалуйста, ответьте на мой последний комментарий   -  person m_beta    schedule 24.09.2020
comment
Вы не добавили соответствующий код. У нас нет ваших файлов. минимальный воспроизводимый пример будет содержать инициализацию коллекции с некоторыми примерами байтовых массивов и строк, а затем код, который вы используете для сделать группировку. В любом случае GroupBy возвращает коллекции группировок, где Key является ключом, а его значения (перечисляемые) - элементами, имеющими один и тот же ключ. Так что-то вроде foreach (var d in duplicates) { var filesWithSameHash = d.ToList(); }.   -  person CodeCaster    schedule 24.09.2020