С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 07.09.2016
Сообщений: 3

Dictionary не находит ключи в коллекции

17.09.2016, 02:51. Показов 1677. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Прошу помощи. Пишу программу, которая ищет все возможные повторы. Столкнулся с проблемой, когда программа рассматривает по второму кругу, например, 0х0405 байты, метод ContainsKey не определяет этот ключ в коллекции, а заводит новую запись.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Runtime.CompilerServices;
 
namespace Povtor
{
    internal class Program
    {
 
        public static int ibytecmp(byte[] data, int fileLength, byte[] key, int lenkey, int startPos) {
            int count;
            
            for (int pos = startPos; pos <= fileLength - lenkey; pos++) {
 
                count = 0;
                for (int i = 0; i < lenkey; i++){
                    if (data[pos + i] == key[i])
                        count++;
                    else break;           
                }
           
                if (count == lenkey)
                    return pos;
            }
 
            return -1;
        }
        
        
 
        private static void Main(string[] args)
        {
            int fileLength;
            bool repeatYes = false; 
 
            if (!File.Exists(Convert.ToString(args[0]))){
                Console.WriteLine("Povtor.exe <file.in>");
                return;
            }
 
            Byte[] data;
            data = File.ReadAllBytes(Convert.ToString(args[0])); 
            fileLength = data.Length; 
            
            Dictionary<byte[], int> arraysCount = new Dictionary<byte[], int>(); 
            
            for (int i = 2, n = data.Length / 2; i < n; i++){
                for (int k = 0, m = data.Length - i; k < m; k++){ 
                    Byte[] repeat = new byte[i]; 
 
                    for (int j = 0; j < i; j++) 
                        repeat[j] = data[j + k];
 
                    int startFrom = 1 + k; 
      
                    int result = ibytecmp(data, fileLength, repeat, repeat.Length, startFrom); 
 
                    while (result != -1){
                        if (arraysCount.ContainsKey(repeat)) 
                            arraysCount[repeat]++;
                        else
                            arraysCount.Add(repeat, 2);
 
                        startFrom = result + 1; 
                        repeatYes = true;
                        result = ibytecmp(data, fileLength, repeat, repeat.Length, startFrom);
                    }
                } 
            }
 
            StreamWriter sr1 = new StreamWriter(System.IO.Path.GetFileNameWithoutExtension(Convert.ToString(args[0])) + ".povtor", false, Encoding.Default);
 
            foreach (KeyValuePair<byte[], int> item in arraysCount.OrderByDescending(x => x.Value)){
                string hex = null;
                    
                foreach (byte bt in item.Key)
                    hex += String.Format("{0:x2}", bt);
 
            sr1.WriteLine("0x" + hex + "\t" + item.Value.ToString() + " раз " + hex.Length/2 + " байт ");
            }
            sr1.Close();
        }
    }
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.09.2016, 02:51
Ответы с готовыми решениями:

Привязать ключи из Dictionary к столбцам Datagridview
Здравствуйте! У меня имеется Dictionary и dataGrid (заранее размеченная). Я пытаюсь добавить в dataGridView значения находящиеся в...

Поиск ключей и данных в коллекции Dictionary
Здравствуйте. Есть коллекция типа Dictionary с именем _Data типа &lt;string, string&gt;. Так же есть переменные типа string с именем _Char,...

Ошибка при заполнении коллекции Dictionary
Доброго времени суток пытаюсь занести в коллекцию значение получаемое функцией через делегат но он выходит из зоны видимости не пойму...

8
Эксперт .NET
 Аватар для Usaga
14111 / 9328 / 1349
Регистрация: 21.01.2016
Сообщений: 35,032
17.09.2016, 03:38
KPOT98, хэш-функция объекта byte[] считается по его адресу, а не содержимому. Два экземпляра byte[] с одинаковым содержимым будут иметь разный адрес и, соответственно, разный хэш. Поэтому словарик (который суть - хэш-таблица) посчитает такие ключи разными.

Добавлено через 2 минуты
Реализуй свой "компаратор" - класс унаследованный от IEqualityComparer<byte[]>, который будет уметь сравнивать массивы байт и подсунь его конструктору словарика.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10425 / 5155 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
17.09.2016, 08:31
Цитата Сообщение от Usaga Посмотреть сообщение
считается по его адресу
Если точнее, то хеш не имеет отношения к адресу. Хеш код для ссылочных типов генерируется (аналогично псевдослучайным числам) и хранится в поле SyncBlockIndex, более подробно здесь.
4
 Аватар для ata
269 / 253 / 186
Регистрация: 28.10.2015
Сообщений: 723
17.09.2016, 09:38
KPOT98, будет гораздо лучше, если ты объяснишь ТЗ. Повторы чего ищутся? И что считается повтором? Есть сильное подозрение, что задача имеет гораздо более простое и изящное решение. Обычно так и бывает.
0
0 / 0 / 0
Регистрация: 07.09.2016
Сообщений: 3
21.09.2016, 04:32  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Реализуй свой "компаратор" - класс унаследованный от IEqualityComparer<byte[]>, который будет уметь сравнивать массивы байт и подсунь его конструктору словарика.
Спасибо, попробую. Я думал что ContainsKey как раз и будем заниматься сравнением наличия ключа в словаре.

Цитата Сообщение от ata Посмотреть сообщение
KPOT98, будет гораздо лучше, если ты объяснишь ТЗ. Повторы чего ищутся? И что считается повтором? Есть сильное подозрение, что задача имеет гораздо более простое и изящное решение. Обычно так и бывает.
Задание следующее: найти все возможные повторы длиной от 2 до "data.Length / 2" (байт), где data.Length - длина входного файла (байт).

Извините, что не появлялся несколько дней.
0
Эксперт .NET
 Аватар для Usaga
14111 / 9328 / 1349
Регистрация: 21.01.2016
Сообщений: 35,032
21.09.2016, 05:35
Цитата Сообщение от KPOT98 Посмотреть сообщение
Я думал что ContainsKey как раз и будем заниматься сравнением наличия ключа в словаре.
Он это и делает. Критерий у него такой: ключи одинаковы, если их GetHashCode() возвращает одно значение и вызов Equals одного ключа для сравнения с другим возвращает true.

Вот тут есть пример.
1
 Аватар для ata
269 / 253 / 186
Регистрация: 28.10.2015
Сообщений: 723
21.09.2016, 20:44
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using System;
using System.Collections.Generic;
 
class Program
{
    public static void Main()
    {
        string s;
        while (!String.IsNullOrEmpty(s = Console.ReadLine()))
        {
            Dictionary<string, bool> multiplicity = new Dictionary<string, bool>();
            for (int i = 0; i < s.Length - 1; i++)
            {
                for (int j = 2; j <= Math.Min(s.Length - i, s.Length / 2); j++)
                {
                    string t = s.Substring(i, j);
                    multiplicity[t] = multiplicity.ContainsKey(t);
                }
            }
            foreach (var kvp in multiplicity)
            {
                if (kvp.Value) Console.WriteLine(kvp.Key);
            }
            Console.WriteLine();
        }
    }
}
1
0 / 0 / 0
Регистрация: 07.09.2016
Сообщений: 3
23.09.2016, 05:29  [ТС]
ata, Usaga, Спасибо, ребята!

Позвольте еще вопрос.
Я переписал программу (еще до ответа от ata) и запустил ее на файл чуть более 1 Мб. Это нормально, что программа за 3 часа не выдала результатов? Вынужден был ее преждевременно оборвать.
0
Эксперт .NET
 Аватар для Usaga
14111 / 9328 / 1349
Регистрация: 21.01.2016
Сообщений: 35,032
23.09.2016, 05:36
Да, для зависшей программы это нормально.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.09.2016, 05:36
Помогаю со студенческими работами здесь

Отсортировать ключи коллекции по алфавиту
Имеется у меня вот такая коллекция Dictionary&lt;string, AboutBooks&gt; dict = new Dictionary&lt;string, AboutBooks&gt;(); Необходимо...

Порядок объектов в коллекции Dictionary<TKey, TValue>
Каким образом будут упорядочены объекты в коллекции? Какой метод должен быть переопределён для этого в классе Time? Dictionary&lt;Time,...

Как получить строковое представление ключей и значений из коллекции Dictionary
Как получить строковое представление значений ключе я значений из коллекции Dictionary

Dictionary: как сохранить значении коллекции после завершения программы
Здравствуйте. Пишу словарь с помощь коллекции Dictionary, столкнуля с проблемой как сохранить значении коллекции после завершения...

Google находит ключи в категориях,а не на страницы материала. (тупо игнорит)
Google находит ключи в категориях,а не на страницы материала. (тупо игнорит) Уже со вторым сайтом такая беда. Google ищет ключи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru