powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поиск ключа по "части" ключа Dictionary<string,string>
22 сообщений из 22, страница 1 из 1
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500100
Mixon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую всех!
Есть ли вариант найти все ключи удолитворяющие определенной маске?
к примеру:
Код: c#
1.
2.
3.
4.
5.
Dictionary<string,string> z=new Dictionary<string,string>();
z.Add("1","один");
z.Add("2","два");
z.Add("10","десять");
z.Add("11","одиннадцать");



найти все ключи "1%", кроме как перебором?
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500105
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.Where(kvp => kvp.Key.Substring(0, 1) == "1")
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500109
Mixon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LR, Спасибо!
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500116
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нафига тогда dictionary?
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500125
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dictionary<int, string> z = new Dictionary<int, string>();
z.Add(0, "ноль");
z.Add(1, "один");
z.Add(2, "два");
z.Add(10, "десять");
z.Add(11, "одиннадцать");

foreach (var i in z.Where(i => i.Key / (int)Math.Pow(10, ((i.Key == 0) ? 1 : (int)Math.Ceiling(Math.Log10(Math.Abs(i.Key) + 0.5))) - 1) == 1))
{
Console.WriteLine(i.Value);
}
=)
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500138
Mixon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Roman Mejtesнафига тогда dictionary?
Ключ словаря, уникален, но собирается из строк, необходимо отобрать значения по группе закодированной в ключ.
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500143
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LR.Where(kvp => kvp.Key.Substring(0, 1) == "1")
это ж тоже перебор, только коротко записанный
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500153
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixonнайти все ключи "1%", кроме как перебором?Никак.
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500154
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КMixonнайти все ключи "1%", кроме как перебором?Никак.
можно написать свою реализацию IDictionary
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500176
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLR.Where(kvp => kvp.Key.Substring(0, 1) == "1")
это ж тоже перебор, только коротко записанный
Не уверен,
https://msdn.microsoft.com/en-us/library/xfhwa508.aspx The Dictionary<TKey, TValue> generic class provides a mapping from a set of keys to a set of values. Each addition to the dictionary consists of a value and its associated key. Retrieving a value by using its key is very fast, close to O(1), because the Dictionary<TKey, TValue> class is implemented as a hash table.
вполне можно предположить что оптимизатор запросов linq использует это...
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500179
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRвполне можно предположить что оптимизатор запросов linq использует это...
Другое дело, что такое выражение (kvp.Key.Substring(0, 1)) будет не по зубам оптимизатору...
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500180
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRвполне можно предположить что оптимизатор запросов linq использует это...
каким боком???
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500184
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей Кпропущено...
Никак.
можно написать свою реализацию IDictionaryНу можно ещё описать Dictionary<string, Dictionary<string, string>> , можно для групп завести второй Dictionary<string, string> , только ТС в вопросе явно указал имеющуюся структуру данных.
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500187
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRИзопропилпропущено...

это ж тоже перебор, только коротко записанный
Не уверен,
https://msdn.microsoft.com/en-us/library/xfhwa508.aspx The Dictionary<TKey, TValue> generic class provides a mapping from a set of keys to a set of values. Each addition to the dictionary consists of a value and its associated key. Retrieving a value by using its key is very fast, close to O(1), because the Dictionary<TKey, TValue> class is implemented as a hash table.
вполне можно предположить что оптимизатор запросов linq использует это...Исходники .Net открыты, можно легко убедиться в обратном.
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500209
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей КИсходники .Net открыты, можно легко убедиться в обратном.
Да, linq2obj where - простой перебор... Хотя, при желании, hash Dictionary<TKey,TValue> в некоторых запросах linq-where пожалуй можна было бы использовать...
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private int FindEntry(TKey key) {
            if( key == null) {
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key);
            }
 
            if (buckets != null) {
                int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
                for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
                    if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
                }
            }
            return -1;
        }
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500217
Roman Mejtes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно еще вот так из пушки по воробушку стрельнуть :)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
            Dictionary<string, string> z = new Dictionary<string, string>();
            z.Add("0", "ноль");
            z.Add("1", "один");
            z.Add("2", "два");
            z.Add("10", "десять");
            z.Add("11", "одиннадцать");
            var lookup = z.ToLookup(p => p.Key.Substring(0, 1), p=>p.Value);
            foreach (var i in lookup["1"])
            {
                Console.WriteLine(i);
            }
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500219
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLRвполне можно предположить что оптимизатор запросов linq использует это...
каким боком???
В данном случае никаким... но, вполне можно было бы использовать для простых запросов типа .Where(kvp => kvp.Key > 1)
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500267
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LRВ данном случае никаким... но, вполне можно было бы использовать для простых запросов типа .Where(kvp => kvp.Key > 1)
но тогда не хэш-таблица должна быть хранилищем, а какая-то разновидность дерева.

оптимизаторы до такого(выбора или генерации подходящей структуры хранения) ещё не дошли.
хотя задача интересная.
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500291
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилLRВ данном случае никаким... но, вполне можно было бы использовать для простых запросов типа .Where(kvp => kvp.Key > 1)
но тогда не хэш-таблица должна быть хранилищем, а какая-то разновидность дерева.

оптимизаторы до такого(выбора или генерации подходящей структуры хранения) ещё не дошли.
хотя задача интересная.Ну Count() оптимизировали, начало положено. :-)

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
       public static int Count<TSource>(this IEnumerable<TSource> source) {
            if (source == null) throw Error.ArgumentNull("source");
            ICollection<TSource> collectionoft = source as ICollection<TSource>;
            if (collectionoft != null) return collectionoft.Count;
            ICollection collection = source as ICollection;
            if (collection != null) return collection.Count;
            int count = 0;
            using (IEnumerator<TSource> e = source.GetEnumerator()) {
                checked {
                    while (e.MoveNext()) count++;
                }
            }
            return count;
        }
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500309
Фотография LR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилно тогда не хэш-таблица должна быть хранилищем, а какая-то разновидность дерева.
ну х.з., вполне себе "одноуровневое однонаправленное дерево" )))
Код: c#
1.
2.
3.
4.
                int hashCode = comparer.GetHashCode(key) & 0x7FFFFFFF;
                for (int i = buckets[hashCode % buckets.Length]; i >= 0; i = entries[i].next) {
                    if (entries[i].hashCode == hashCode && comparer.Equals(entries[i].key, key)) return i;
                }
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500320
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие-то оптимизации возможны если данные упорядочены по ключу, тогда можно применить тот же бинарный поиск и т.п.
Dictionary это хэш-таблица, данные там хранятся упорядоченные по хэшу ключа, поэтому кроме как перебором оттуда никак не выберешь.

Можно взять OrderedDictionary , тогда в нем выполнить бинарный поиск первого попавшегося ключа подходящего под условие, а затем выбрать все подходящие рядом с ним. Но это сработает если условие поиска типа "1%", если же "%1" то только перебор.
...
Рейтинг: 0 / 0
Поиск ключа по "части" ключа Dictionary<string,string>
    #39500388
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mixonнайти все ключи "1%",
Это не ключ, а пол ключа.
Если надо быстро, то переливай в другую коллекцию м разбивкой на буквы или СВОЙ КЛЮЧ.
Или в базу с полнотекстовым поиском like
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Поиск ключа по "части" ключа Dictionary<string,string>
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]