Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 Аватар для Jean-Esther
9 / 9 / 3
Регистрация: 28.02.2009
Сообщений: 66

Dictionary mapping

20.08.2013, 13:24. Показов 942. Ответов 0
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Дано: список List<B> b и тип
C#
1
2
3
4
5
6
class T
{
    public B prop;
    public double time;
    public T(B prop, double time) {...}
}
Есть функция, которая всякому элементу из b сопоставляет T?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private T? GetT(B b1)
{
    T? t = null;
    double? m = null;
    foreach (var b2 in b.Skip(b0 => b1 != b0).Skip(1))
    {
        double? timing = b1.Timing(b2);
        // грубо говоря, if (m > timing)
        if (timing.HasValue && (!m.HasValue || m.Value > timing.Value))
            t = new T(b2, timing.Value);
    }
    return t;
}
В принципе, можно довольствоваться этой функцией. Но вычисления b1.Timing(b2) очень ёмкие, потому хочется их кешировать.
Для этого я создал список (условно говоря, потому что сейчас происходит рефакторинг, раньше b1 также было полем T)
C#
1
2
3
4
5
IEnumerable<Pair<B,T?>> TimeTable()
{
    foreach (var b1 in b)
        yield return new Pair(b1, GetT(b1));
}
Глядя на этот список понятно, что B выступает в роли ключа, он уникален и однозначно определяет T?
Поэтому решил переписать эту функцию, чтоб она возвращала словарь (код условный)
C#
1
2
3
4
5
6
7
IDictionary<B,T?> TimeTable()
{
    var d = new Dictionaty<B, T?>(b.Count);
    foreach (var b1 in b)
        d.Add(b1, GetT(b1));
    return d;
}
В определённом смысле словарь — это и есть та самая функция GetT, только все вычисления производятся сразу. И всё бы хорошо, если б не один узкий момент, который у меня возник.
Я хочу найти ключ, при котором time минимальна, и у меня с этим проблема.

Я описал проблему целиком, хорошо бы, если кто-нибудь её проанализирует и скажет, как лучше организовать программу. Из открытых вопросов:
1. Какую лучше использовать структуру для хранения значения функции GetT и её возможного аргумента?
2. Если IDictionary, то как его создавать? Через объявление словаря и его заполнение по Add, как я сделал, или есть какие-то специальные штуки, типа yield или аналоги расширяющих методов из Enumerable?
3. Как минимум искать-то?
4. менее важный вопрос: есть ли что-то по-красивее b.Skip(b0 => b1 != b0).Skip(1)?

Добавлено через 23 часа 22 минуты
Сейчас использую IDictionary, написал метод-расширение
C#
1
2
3
4
5
public static void ForEach<K, V>(this IDictionary<K, V> source, Action<K, V> action)
{
    foreach (KeyValuePair<K, V> kvp in source)
        action(kvp.Key, kvp.Value);
}
Вместо T?, который нельзя использовать как аргумент-тип IDictionary почему-то, я использую просто T, потому что null является допустимым значением объекта типа T.
Минимум ищу такой функцией:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private IDictionary<B, T> GetMin(IDictionary<B, T> timetable)
        {
            if (timetable.Count == 0) return null;
            var c = timetable.Values.Where(tt => tt != null);
            if (c.Count() == 0) return new Dictionary<B, T>(0);
            double t = c.Min(tt => tt.time);
            var d = new Dictionary<B, T>();
            timetable.ForEach((b, tt) =>
            {
                if (Math.Abs(tt.time - t) < _PRECISSION) // 1e-8
                    d.Add(b, tt);
            });
            return d;
        }
Вроде работает, но код мне не очень нравится.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.08.2013, 13:24
Ответы с готовыми решениями:

Проинициализировать значениями dictionary вложенный в dictionary
Народ, помогите, как проинициализировать значениями такую конструкцию: Dictionary &lt;int,Dictionary&lt;string, int&gt;&gt;

Сложный Dictionary<MyClass, Dictionary<List<MyClass2>, List<string>>> MyDictionary
Здравствуйте. Помогите plz реализовать обращения к словарю вида : Dictionary&lt;MyClass, Dictionary&lt;List&lt;MyClass2&gt;,...

Как преобразовать Dictionary<string, int> в Dictionary<object, int>
Есть метод с сигнатурой public KeyValuePair&lt;string, int&gt; MyMethod(Dictionary&lt;string, int&gt; dic, Random rndm) {} Алгоритму...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.08.2013, 13:24
Помогаю со студенческими работами здесь

Как архивировать Dictionary<string, Dictionary<string, decimal[,]>>
Программа периодически создает Dictionary&lt;string, Dictionary&lt;string, decimal&gt;&gt; большого размера. Как сжать gzip такой словарь перед его...

Dictionary<Tuple<string,string>, Dictionary<int,int>> dict - возможно ли?
Собственно вопрос в заголовке. Возможно ли использовать объект вида Dictionary&lt;Tuple&lt;string,string&gt;, Dictionary&lt;int,int&gt;&gt; ...

Dictionary
Есть Dictionary вложенный в Dictionary Dictionary &lt;string,Dictionary&lt;int,int&gt;&gt; Cash_machine = new...

Работа с Dictionary
Есть следующий словарь. var dict = new Dictionary&lt;string, Dictionary&lt;string, int&gt;&gt;(); который содержит следующие данные a: b...

Hashset и Dictionary
Есть структура. Какой интерфейс нужно реализовать, чтобы при работе с Hashset&lt;MyStruct&gt; и Dictionary&lt;MyStruct, T&gt;, объекты моей...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
Новые блоги и статьи
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита, которое может. . .
Команды "Заполнить" и "Очистить" на форме документа
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". На примере нетипового документа разработанного в конфигурации КА2. В качестве источника данных указан регистр накопления, в который записываются данные о. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru