Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 19.11.18 17:44
Оценка:
Ведь удобно то и однозначность, как и со строками, вполне достигается.
Re: Почему не используется оператор + для списков и пр.?
От: #John Европа https://github.com/ichensky
Дата: 20.11.18 06:24
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ведь удобно то и однозначность, как и со строками, вполне достигается.

С какими однозначино с теми исспользуется, напр. в делегатах. В каких не однозначно, т.е. не понятно в какой последовательности должны идти эллементы и как должна выделятся память для нового списка, в тех не исспользуется.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[2]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 20.11.18 08:58
Оценка:
Здравствуйте, #John, Вы писали:

J>С какими однозначино с теми исспользуется, напр. в делегатах. В каких не однозначно, т.е. не понятно в какой последовательности должны идти эллементы и как должна выделятся память для нового списка, в тех не исспользуется.


Почему не понятно? В Pythone мне пришлось столкнуться — там сразу понятно стало что делает оператор + с двумя списками. А что, много вариантов? Естественно создается 3 список и последовательно в него копируют сначала левый потом правый Какие еще варианты? Скопировать наоборот, сначала правый потом левый? Или не выделять память?
Re[3]: Почему не используется оператор + для списков и пр.?
От: #John Европа https://github.com/ichensky
Дата: 20.11.18 12:24
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, #John, Вы писали:


J>>С какими однозначино с теми исспользуется, напр. в делегатах. В каких не однозначно, т.е. не понятно в какой последовательности должны идти эллементы и как должна выделятся память для нового списка, в тех не исспользуется.


S>Почему не понятно? В Pythone мне пришлось столкнуться — там сразу понятно стало что делает оператор + с двумя списками. А что, много вариантов? Естественно создается 3 список и последовательно в него копируют сначала левый потом правый Какие еще варианты?

В Pythone, наверно, нет коллекций/списков: Queue,Stack,LinkedList,Dictionary,Hashtable,SortedList,Partitioner и т.д. для которых такое повидение "слияние списков" не подходит.
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[4]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 20.11.18 12:45
Оценка:
Здравствуйте, #John, Вы писали:

J>В Pythone, наверно, нет коллекций/списков: Queue,Stack,LinkedList,Dictionary,Hashtable,SortedList,Partitioner и т.д. для которых такое повидение "слияние списков" не подходит.


Для Queue — вполне очевидно — создаете новую Queue и добавляете сначала элементы из левого потом из правой очереди.

Давайте один пример разберем, для которого явно не понятно что делает оператор +. Какой из приведенных вами наиболее ярко демонстрирует неопределенность + -оператора?
Re: Почему не используется оператор + для списков и пр.?
От: Sharowarsheg  
Дата: 20.11.18 12:46
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ведь удобно то и однозначность, как и со строками, вполне достигается.


https://www.destroyallsoftware.com/talks/wat

С середины про Javascript, однозначность, строки, и прочее.
Re[5]: Почему не используется оператор + для списков и пр.?
От: #John Европа https://github.com/ichensky
Дата: 20.11.18 13:06
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Давайте один пример разберем, для которого явно не понятно что делает оператор +. Какой из приведенных вами наиболее ярко демонстрирует неопределенность + -оператора?

Пусть будет два списка
            var x = new Dictionary<int, string>(){
                [1]="aaaaaa",
                [2]="bbbbbb"
            };
            var y = new Dictionary<int, string>(){
                [1]="*******",
                [2]="bbbbbb"
            };

Как должен выглядеть новый список после слияния?
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[6]: Почему не используется оператор + для списков и пр.?
От: torvic Голландия  
Дата: 20.11.18 13:32
Оценка:
Здравствуйте, #John, Вы писали:
J>Как должен выглядеть новый список после слияния?
Map(1 -> List(aaaaaa, *******), 2 -> List(bbbbbb, bbbbbb))
Re[6]: Почему не используется оператор + для списков и пр.?
От: AlexRK  
Дата: 20.11.18 13:35
Оценка: 12 (1) -1 :))
Здравствуйте, #John, Вы писали:

J>Пусть будет два списка

J>
J>            var x = new Dictionary<int, string>(){
J>                [1]="aaaaaa",
J>                [2]="bbbbbb"
J>            };
J>            var y = new Dictionary<int, string>(){
J>                [1]="*******",
J>                [2]="bbbbbb"
J>            };
J>

J>Как должен выглядеть новый список после слияния?

            var z = new Dictionary<int, string>(){
                [1]="*a*a*a*a*a*a*",
                [2]="bbbbbb"
            };
Re: Почему не используется оператор + для списков и пр.?
От: Kolesiki  
Дата: 20.11.18 14:05
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Ведь удобно то и однозначность, как и со строками, вполне достигается.


Контрвопрос: а с какого перепоя плюс должен там использоваться?! Неужели .Join тебе так впадлу писать, что тебе подавай операторы? А что делать со следующим нытиком, требующим "минус" для списков? А декартово умножение? Ты влезаешь в такую тему, где слабо шаришь. Нужны "интересные" операторы — велкам ту Perl! Вот там десять раз почешешь репу, какой из символов (или ряд символов) заюзать, чтобы получить правильный результат. Пиши на Перл, серьёзно — удивишься, насколько лаконично можно выражать свои намерения.
Re[6]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 20.11.18 18:49
Оценка:
Здравствуйте, #John, Вы писали:

J>Пусть будет два списка

J>
J>            var x = new Dictionary<int, string>(){
J>                [1]="aaaaaa",
J>                [2]="bbbbbb"
J>            };
J>            var y = new Dictionary<int, string>(){
J>                [1]="*******",
J>                [2]="bbbbbb"
J>            };
J>

J>Как должен выглядеть новый список после слияния?

Это должно быть эквивалентно записи:

dic.Add(1, "aaaaaa");
dic.Add(2, "bbbbbb");
dic.Add(1, "*******");
dic.Add(2, "bbbbbb");


И приведет к исключению. Что тут странного? Вы всегда создаете новый контейнер и пихаете в него элементы двух контейнеров.



В чем неопределенность поведения?
Re[7]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 20.11.18 18:50
Оценка:
Здравствуйте, AlexRK, Вы писали:


ARK>
ARK>            var z = new Dictionary<int, string>(){
ARK>                [1]="*a*a*a*a*a*a*",
ARK>                [2]="bbbbbb"
ARK>            };
ARK>


Вы создаете контейнер, который включает в себя элементы из двух контейнеров. Значения элементов изменять не нужно.
Re[2]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 20.11.18 19:09
Оценка:
Здравствуйте, Kolesiki, Вы писали:

K>Контрвопрос: а с какого перепоя плюс должен там использоваться?! Неужели .Join тебе так впадлу писать, что тебе подавай операторы?


Так давайте вообще отменим операторы и будем только функции использовать. Ясно же зачем — операторы намного нагляднее.
Re: Почему не используется оператор + для списков и пр.?
От: Danchik Украина  
Дата: 20.11.18 20:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ведь удобно то и однозначность, как и со строками, вполне достигается.


Может чтобы вы могли предсказуемо контролировать результат? Иногда лучше вернуть иммутабельный контейнер, иногда выгоднее добавить в текущий. Я за иммутабельность, но вменяемая библиотека появилась попозже стандарта.
В принципе может и добавят когда-то перегрузку таких операторов, но почему-то не спешат.
Re[7]: Почему не используется оператор + для списков и пр.?
От: #John Европа https://github.com/ichensky
Дата: 20.11.18 21:09
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Это должно быть эквивалентно записи:


S>
S>dic.Add(1, "aaaaaa");
S>dic.Add(2, "bbbbbb");
S>dic.Add(1, "*******");
S>dic.Add(2, "bbbbbb");
S>


S>И приведет к исключению. Что тут странного? Вы всегда создаете новый контейнер и пихаете в него элементы двух контейнеров.


S>


S>В чем неопределенность поведения?

Что бы возникло исключение .net framework придется перебрать все ключи одного Dictionary и сравнить с каждым ключем со второго .
А это повидение совсем отличается от повидения: "просто создать новый список и скопировать память из двух других."
Підтримати Україну у боротьбі з країною-терористом.

https://prytulafoundation.org/
https://u24.gov.ua/

Слава Збройним Силам України!!! Героям слава!!!
Re[8]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 20.11.18 21:21
Оценка:
Здравствуйте, #John, Вы писали:

S>>В чем неопределенность поведения?

J>Что бы возникло исключение .net framework придется перебрать все ключи одного Dictionary и сравнить с каждым ключем со второго .
J>А это повидение совсем отличается от повидения: "просто создать новый список и скопировать память из двух других."

Понятно что это просто синтаксический сахар, т.е. не ради прироста скорости а ради простоты написания.

И еще. Для словарей это не так уж нужно. А вот для массивов и списков — было бы весьма, так как копировать приходится довольно часто (и здесь то можно было бы применить низкоуровневое копирование):

byte[] prefix = {1, 2, 3};
byte[] body = { 4, 5, 6 };
byte[] suffix = { 7, 8, 9 };

return prefix + body + suffix;


Красота?
Отредактировано 20.11.2018 21:21 Shmj . Предыдущая версия .
Re: Почему не используется оператор + для списков и пр.?
От: Sinatr Германия  
Дата: 21.11.18 13:06
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Ведь удобно то и однозначность, как и со строками, вполне достигается.


А можно поконкретнее? Какой код не нравится, как вы хотите и почему?
---
ПроГLамеры объединяйтесь..
Re[2]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 21.11.18 17:39
Оценка:
Здравствуйте, Sinatr, Вы писали:

S>А можно поконкретнее? Какой код не нравится, как вы хотите и почему?


Хочу так:

byte[] prefix = {1, 2, 3};
byte[] body = { 4, 5, 6 };
byte[] suffix = { 7, 8, 9 };

var result = prefix + body + suffix;


Идея понятна? Попробуйте то же самое записать без оператора +
Re[3]: Почему не используется оператор + для списков и пр.?
От: Danchik Украина  
Дата: 21.11.18 19:12
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Sinatr, Вы писали:


S>>А можно поконкретнее? Какой код не нравится, как вы хотите и почему?


S>Хочу так:


S>
S>byte[] prefix = {1, 2, 3};
S>byte[] body = { 4, 5, 6 };
S>byte[] suffix = { 7, 8, 9 };

S>var result = prefix + body + suffix;
S>


S>Идея понятна? Попробуйте то же самое записать без оператора +


Ой да ладно, всегда пишу так и не заморачиваюсь.

var result = prefix
  .Concat(body)
  .Concat(suffix)
  .ToArray()


Плюс этого подхода в том что если мне не нужен массив, я могу итерацию проводить без аллокации конечного массива.
Re[4]: Почему не используется оператор + для списков и пр.?
От: Shmj Ниоткуда  
Дата: 21.11.18 20:52
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Плюс этого подхода в том что если мне не нужен массив, я могу итерацию проводить без аллокации конечного массива.


Можно вообще операторы не использовать — только функции. Но операторы вообще-то нагляднее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.