powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# -- помогите разобрать код
11 сообщений из 11, страница 1 из 1
C# -- помогите разобрать код
    #37350015
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
static void Main()
   {
       // Construct a ConcurrentDictionary
       ConcurrentDictionary<int, int> cd = new ConcurrentDictionary<int, int>();

       // Bombard the ConcurrentDictionary with 10000 competing AddOrUpdates
       Parallel.For(0, 10000, i =>
       {
           // Initial call will set cd[1] = 1.  
           // Ensuing calls will set cd[1] = cd[1] + 1
           cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
       });
   }

Объясните, пожалуйста, что обозначает фрагмент "(key, oldValue) => oldValue + 1"
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350051
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосОбъясните, пожалуйста, что обозначает фрагмент "(key, oldValue) => oldValue + 1" это лямбда-выражение (объект-функция, созданный прямо в коде, "на лету").
тоже самое что "анонимный метод"
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350276
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, прочитал про анонимные методы и лямда-выражения.

Осталось непонятно, откуда параметры "key, oldValue" взялись? Явно они не описаны, делегата в примере тоже нет (пример я из MSDN скопировал)
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350300
Naf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосСпасибо, прочитал про анонимные методы и лямда-выражения.

Осталось непонятно, откуда параметры "key, oldValue" взялись? Явно они не описаны, делегата в примере тоже нет (пример я из MSDN скопировал) имена аргументов анонимной функции
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350381
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nafимена аргументов анонимной функции
Это я понял. Я не понимаю, как компилятор понимает, что key и oldValue равны 1 изначально.

Получается, что компилятор видит структуру KeyValuePair<TKey, TValue> -- элемент коллекции ConcurrentDictionary изнутри, но у этой структуры нет поля oldValue... Мне понятно, что лямбда-функция постоянно увеличивает из двух переданных параметров второй на единицу, мне непонятно: откуда лямбда-функция знает, что "точкой отсчета" является (1, 1), и как сохраняется промежуточное значение

P.S. Я очень слабо знаю С#, и потому спрашиваю
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350399
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосЭто я понял. Я не понимаю, как компилятор понимает, что key и oldValue равны 1 изначально.cd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
AddOrUpdate третьим параметром принимает ссылку на метод. И внутри себя вызывает этот метод, передавая ему параметры 1 и 1. Так key, oldValue внутри метода становятся единицами.
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350418
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Яростный Мечcd.AddOrUpdate(1, 1, (key, oldValue) => oldValue + 1);
AddOrUpdate третьим параметром принимает ссылку на метод. И внутри себя вызывает этот метод, передавая ему параметры 1 и 1. Так key, oldValue внутри метода становятся единицами.
Я понимаю, что третий параметр -- делегат Func<T1, T2, TResult>

public delegate TResult Func<in T1, in T2, out TResult>(
T1 arg1,
T2 arg2
)

Мне не понятно, откуда в T1 и T2 единицы -- они же не объявлены явно. Именно момент передачи параметров не понятен
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350426
Фотография Яростный Меч
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЖентосИменно момент передачи параметров не понятен вызов делегата и передача параметров происходят внутри AddOrUpdate, как уже говорилось.
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37350458
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10969507 Вот, если бы этот момент Вы разжевали, я был бы очень благодарен
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37351937
авторh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жентос 10969507 Вот, если бы этот момент Вы разжевали, я был бы очень благодарен

что не понятно? там внутри примерно такой код

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
void Dictinoary.AddOrUpdate(T key, T initialValue, lambda(T key, T oldValue) updateFn)
{
    if this.exist(key){ 
          this[key] = updateFn(key, this[key]);
    } else {
          this[key] = initialValue;
    }    
}
за исключением МНОГОПОТОЧНОСТИ и ПАРАЛЕЛЛЬНОСТИ и C#-ого синтаксиса.
...
Рейтинг: 0 / 0
C# -- помогите разобрать код
    #37352214
Жентос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, теперь все понятно
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / C# -- помогите разобрать код
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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