Здравствуйте, Sinclair, Вы писали:
S>То есть для того, чтобы конкатенировать спаны вот таким образом, надо дать им operator+. S>А для массивов придётся пилить компилятор — способа приделать оператор + к встроенному типу нет.
Вот поэтому C# -- кривая паделка микрософта, а C++ -- язык будущего.
Куда в .NET не ткни -- прибито гвоздями и компиляторная магия.
Всё здорово и замечательно только в проектах уровня хелло-ворлд, как до дела
доходит, сразу проблемы.
Здравствуйте, Sinclair, Вы писали:
S>>С чего вы взяли что потребность низкая? S>С того, что подобная штука даже не обсуждается в https://github.com/dotnet/csharplang.
Не обсуждается — потому что боты не смогут породить новую идею. Пока не ткнешь носом — будут обсуждать по кругу только то что им скажут.
Ну ок. Что вы делаете с массивами вообще? Для чего они вам?
Здравствуйте, Muxa, Вы писали:
S>>В данном случае разницы не будет, очевидно. M>Ты же сам комментом выше писал что разница будет. Давай ты сперва сам определишься?
Бро, прежде чем обвинить кого-то в тупости, убедись что у тебя хватило мозгов его понять.
Есть системные типы — порядок байт в них зависит от системы. .Net на данный момент не используется ни на одной системе с BigEndian, к слову.
Если же ты сам записываешь некое число, представляешь его в массиве байт — то ты сам и решаешь с какой стороны будет наиболее высокий разряд. Обычно выбирают LittleEndian, когда 0 элемент массива младший. Но это никак не определятся системой — ты сам решаешь.
Здравствуйте, Muxa, Вы писали:
M>Зачем мне записывать число как байты? Чем не подходит int a = 1234?
Если число не вмещается в 8 байт, вестимо. Для этого ведь предлагают реализовать оператор + как сложение чисел?
Мое мнение — сложение массивов как чисел — не просто вызывает неоднозначность с Big/Little -Endian, но и как раз менее применимо, чем конкатенация. Сложение нужно только для математики длинных чисел — это отдельный класс типа BigInteger. А вот конкатенация нужна намного чаще и для всех типов массивов она актуальная.
Что за бред ты несешь?
Сложение векторов это операция, которую применяют миллионы раз в каждой компьютерной игре при расчете графики.
Открой любую библиотеку линейной алгебры, там сложение векторов в каждой функции.
Здравствуйте, Muxa, Вы писали:
M>Что за бред ты несешь? M>Сложение векторов это операция, которую применяют миллионы раз в каждой компьютерной игре при расчете графики. M>Открой любую библиотеку линейной алгебры, там сложение векторов в каждой функции.
Это специализированные преобразования. Как вы будете вычислять сумму массивов строк? Или сумму списков неких Item? Никак. Это подходит только для целых чисел (и даже там есть неоднозначность Little-Big). Даже сложить два массива float — это уже не однозначное преобразование.
M>>Что за бред ты несешь? M>>Сложение векторов это операция, которую применяют миллионы раз в каждой компьютерной игре при расчете графики. M>>Открой любую библиотеку линейной алгебры, там сложение векторов в каждой функции.
S>Это специализированные преобразования. Как вы будете вычислять сумму массивов строк?
Применить оператор "+" поэлементно.
S>Или сумму списков неких Item? Никак.
Применить оператор "+" поэлементно.
S>Это подходит только для целых чисел (и даже там есть неоднозначность Little-Big). S>Даже сложить два массива float — это уже не однозначное преобразование. надо коллегам в геймдеве рассказать, а то они не в курсе.
S>А конкатенация — актуальна для всего.
И как же нам скантатенировать два элемента struct { int x; void* y; }?
Здравствуйте, Shmj, Вы писали:
S>А конкатенация — актуальна для всего.
Слишком сильное заявление. С моей колокольни она не нужна примерно для всего, за редким исключением. Например, подсунуть склеенный массив в какой-нибудь JSON форматтер. Т.е. там, где единицей обмена информации является именно массив. Но это единичные случаи, т.к. базой для ввода/вывода являются потоки, работа с которыми не требует конкатенации массивов, более того, она там избыточна. Даже обмен с неуправляемой памятью конкатенации не требует.
Здравствуйте, Muxa, Вы писали:
S>>Это специализированные преобразования. Как вы будете вычислять сумму массивов строк? M>Применить оператор "+" поэлементно.
А в случае с целыми числами — вы просто поэлементно складываете или же учитываете переполнение и переносите в новый разряд?
S>>Или сумму списков неких Item? Никак. M>Применить оператор "+" поэлементно.
А если оператор не определен для Item?
S>>Это подходит только для целых чисел (и даже там есть неоднозначность Little-Big). M> S>>Даже сложить два массива float — это уже не однозначное преобразование. M> надо коллегам в геймдеве рассказать, а то они не в курсе.
А причем тут геймдев?
S>>А конкатенация — актуальна для всего. M>И как же нам скантатенировать два элемента struct { int x; void* y; }?
Конкатенация массивов/списков — просто создаете новый массив, который по длине равен двум — и копируете ссылки на элементы.
Здравствуйте, samius, Вы писали:
S>>А конкатенация — актуальна для всего. S>Слишком сильное заявление. С моей колокольни она не нужна примерно для всего, за редким исключением. Например, подсунуть склеенный массив в какой-нибудь JSON форматтер. Т.е. там, где единицей обмена информации является именно массив. Но это единичные случаи, т.к. базой для ввода/вывода являются потоки, работа с которыми не требует конкатенации массивов, более того, она там избыточна. Даже обмен с неуправляемой памятью конкатенации не требует.
Для чего вы вообще используете массивы/списки?
Вообще мешать не будет. Кроме как однозначная конкатенация — других разумных вариантов нет. Если поэлементное складывание — то как быть с переполнением, как складывать типы, отличные от целых чисел?
+ можно добавить — как для строк. Кто не хочет — можно не использовать.
Здравствуйте, Shmj, Вы писали:
S>Особо не смотрел. Но просто для поддержания беседы — вроде так и не сделали, чтобы можно было конкатенацию массивов (или там Span) простым знаком +?
S>byte[] array1 = ... S>byte[] array2 = ... S>byte[] array3 = array1 + array2;
S>?
S>>>Это специализированные преобразования. Как вы будете вычислять сумму массивов строк? M>>Применить оператор "+" поэлементно. S>А в случае с целыми числами — вы просто поэлементно складываете или же учитываете переполнение и переносите в новый разряд?
В какой еще новый разряд? math24.ru/сложение-и-вычитание-векторов.html
S>>>Или сумму списков неких Item? Никак. M>>Применить оператор "+" поэлементно. S>А если оператор не определен для Item?
Не скомпилируется пока не определишь.
S>>>Это подходит только для целых чисел (и даже там есть неоднозначность Little-Big). M>> S>>>Даже сложить два массива float — это уже не однозначное преобразование. M>> надо коллегам в геймдеве рассказать, а то они не в курсе. S>А причем тут геймдев?
Сложение векторов это одна из основных операций в компьютерной графике.
S>>>А конкатенация — актуальна для всего. M>>И как же нам скантатенировать два элемента struct { int x; void* y; }? S>Конкатенация массивов/списков — просто создаете новый массив, который по длине равен двум — и копируете ссылки на элементы.
Ну, если конкатенация актуальна для всего как сконкатенировать два объекта этой структуры?
Здравствуйте, Muxa, Вы писали:
S>>А причем тут геймдев? M>Сложение векторов это одна из основных операций в компьютерной графике.
И? C# — это что, язык исключительно для компьютерной графики? Это язык общего значения.
S>>>>А конкатенация — актуальна для всего. M>>>И как же нам скантатенировать два элемента struct { int x; void* y; }? S>>Конкатенация массивов/списков — просто создаете новый массив, который по длине равен двум — и копируете ссылки на элементы. M>Ну, если конкатенация актуальна для всего как сконкатенировать два объекта этой структуры?
Мы о конкатенации СПИСКОВ!!! А элементы невозможно конкатенировать, за редким исключением.
S>>>А причем тут геймдев? M>>Сложение векторов это одна из основных операций в компьютерной графике. S>И? C# — это что, язык исключительно для компьютерной графики? Это язык общего значения.
Так и сложение векторов используется не только в графике.
S>>>>>А конкатенация — актуальна для всего. M>>>>И как же нам скантатенировать два элемента struct { int x; void* y; }? S>>>Конкатенация массивов/списков — просто создаете новый массив, который по длине равен двум — и копируете ссылки на элементы. M>>Ну, если конкатенация актуальна для всего как сконкатенировать два объекта этой структуры? S> Мы о конкатенации СПИСКОВ!!! А элементы невозможно конкатенировать, за редким исключением.
А, я просто думал что "конкатенация — актуальна для всего". Ошибался видимо.
Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, samius, Вы писали:
S>Для чего вы вообще используете массивы/списки?
Чаще всего для того, что бы пробежать по последовательности более одного раза внутри одного метода. Но даже если в своей двоичной сериализации данных, не помню, что бы мне нужна была конкатенация массивов. Может быть она кажется простым решением в некоторых случаях, но это шикарный способ заскочить в LOH лишний раз. S>Вообще мешать не будет. Кроме как однозначная конкатенация — других разумных вариантов нет. Если поэлементное складывание — то как быть с переполнением, как складывать типы, отличные от целых чисел?
Мешать-то не будет. Для чего она нужна?
Ну да ладно, допустим, интероп. Но как часто вообще нужен интероп и тем более, конкатенация массивов для него? В моей практике не каждые 5 лет такое бывает.
S>+ можно добавить — как для строк. Кто не хочет — можно не использовать.
Ну да строки-то мы складываем каждый день не по разу, однако, чем дальше, тем реже. Благодаря интерполяции.
Здравствуйте, Muxa, Вы писали:
S>>И? C# — это что, язык исключительно для компьютерной графики? Это язык общего значения. M>Так и сложение векторов используется не только в графике.
Я ни разу не сталкивался — ни в какой области.
S>>>>>>А конкатенация — актуальна для всего. M>>>>>И как же нам скантатенировать два элемента struct { int x; void* y; }? S>>>>Конкатенация массивов/списков — просто создаете новый массив, который по длине равен двум — и копируете ссылки на элементы. M>>>Ну, если конкатенация актуальна для всего как сконкатенировать два объекта этой структуры? S>> Мы о конкатенации СПИСКОВ!!! А элементы невозможно конкатенировать, за редким исключением. M>А, я просто думал что "конкатенация — актуальна для всего". Ошибался видимо.
Умейте читать в контексте — конкатенация списка актуальна для любого типа элемента списка. Не нужно реализовывать + для отдельных элементов.
S>Умейте читать в контексте — конкатенация списка актуальна для любого типа элемента списка.
Даже если список с циклом?
S> Не нужно реализовывать + для отдельных элементов.
Погоди, погоди, это что получается если мне нужно поэлементно применить некоторую операцию к элементам контейнера, то я должен реализовать эту операцию для этих элементов?
Прям вечер откровений какой-то.
Здравствуйте, Shmj, Вы писали:
S>Особо не смотрел.
using System;
using System.Linq;
using static ArrayFunctions;
var a = new[] { 1, 2, 3 };
var b = new[] { 4, 5, 6 };
var c = a.Concat(b).ToArray();
var d = a.Union(b).ToArray();
var e = a.Plus(b);
var j = plus(a,b);// <= забавно, функция занимает столько же символов сколько и метод.
Чем '+' семантически лучше метода?
public static class ArrayExt {
public static T[] Plus<T>(this T[] array,T[] add) => array.Union(add).ToArray();
}
public static class ArrayFunctions {
public static T[] plus<T>(T[] array,T[] add) => array.Plus(add);
}