2D массивы без зубцов

С помощью int arr[4][2] в C++ я мог перебирать строки и столбцы, что идеально подходит практически для всего.

На C# я могу реализовать это так: int[10,10]. int[10][] бесполезно, так как это неровный массив, а неровный массив мне не нужен.

Теперь мне нужно выбрать каждую строку и обработать каждую строку отдельно, если я хочу раздуть свой код блоками кода, которые точно описывают, как это сделать. Разве C# не должен быть обновлением C++ или, по крайней мере, более простым в использовании? Почему у меня не может быть простой матрицы?

Вместо того, чтобы делать arr[0].Sum() для суммирования строки, мне нужно сделать что-то вроде arr.Take(y).Sum() — создать по пути новый массив. Но вы не можете этого сделать, поскольку LINQ этого не поддерживает.

Единственный способ сделать это сейчас — List<List<int>>(). Как вы с этим справляетесь?

Я сильно подозреваю, что вы получите более полезные ответы, если уберете из вопроса некоторые гиперболы и вместо этого предоставите требования. (Наиболее подходящий способ достижения того, что вам нужно, действительно будет зависеть от части «что вам нужно»...)

Jon Skeet 21.08.2024 19:55

@EduardG Что-нибудь в Span2D<T> выглядит так, как вы хотите?

Andrew Morton 21.08.2024 20:06

@AndrewMorton кажется, что у меня нет к этому доступа, возможно, потому, что я использую .NET Framework 4.7.2. Пытаюсь выяснить, где его найти... Хотя у меня есть Span<T>.

Eduard G 21.08.2024 20:11

@EduardG Похоже, вам просто придется использовать циклы for?

Andrew Morton 21.08.2024 20:15

Есть ли в C++ разница между двумерными массивами и массивами массивов? Если суть задаваемого вопроса заключается в том, как сделать на C# что-то, что было бы легко на C++, то одного только синтаксиса может быть недостаточно для сравнения, поскольку то, что кажется одним и тем же синтаксисом на разных языках, может означать очень разные вещи. «Как ты с этим справляешься?» - Концептуально разделив эти два понятия и используя наиболее подходящую структуру для решения поставленной задачи. И похоже, что задача здесь — использовать массив массивов с линейным доступом, а не двумерный массив с доступом к множествам.

David 21.08.2024 20:18

@AndrewMorton Как выбрать все 10 элементов из строки 0 из [50,10]? Кажется, нет практического пути. Я хочу сделать «var row0Sum = Sum(array[0])». В цикле for мне пришлось бы суммировать их один за другим, что непрактично для моих нужд, поскольку сумма в моем случае — дорогостоящая операция. Вместо этого мне нужно объявить новый массив для хранения каждой строки и заполнить его, используя исходный массив через цикл for, и только затем передать его функции Sum.

Eduard G 21.08.2024 20:20

"Метод ArrayExtensions.GetColumn<T>(T[][], Int32)" ссылка

rotabor 21.08.2024 20:23

@Дэвид, да, меня забавляет то, что в C# отсутствует основополагающий фрагмент кода и математическая логика. Это простая матрица, и C# не может ее представить. Задача состоит в том, чтобы эффективно объявить матрицу строк и столбцов, а затем передать каждую строку функции, запуск которой требует больших затрат (поэтому ее нельзя запускать для каждого отдельного элемента, но это нужно делать построчно). . Чтобы сделать это, мне нужно запустить другой дорогостоящий алгоритм для выделения нового массива для представления моих строк вместо использования значений в уже существующем массиве [,].

Eduard G 21.08.2024 20:24

@rotabor Я использую .NET Framework, а Microsoft.Toolkit ArrayExtensions — это устаревший пакет, который я предпочитаю не добавлять в свое решение для последовательного обхода массива. Причина, по которой я использую .NET, заключается в том, что мне нужен низкоуровневый доступ к API Win32 с помощью PInvoke, который не поддерживается в .NET Core из-за его многоплатформенной совместимости.

Eduard G 21.08.2024 20:26

Вместо этого я решил использовать массивы Jagged, поэтому [x][]. Я не могу с этим синтаксисом и необходимостью выделять каждую отдельную строку в X, но более элегантного решения, похоже, не существует.

Eduard G 21.08.2024 20:35

@EduardG Мне кажется, вы недостаточно подробно описали проблему в вопросе. Например, почему вам нужно использовать Sum вместо +?

Andrew Morton 21.08.2024 20:40

@EduardG P/Invoke не исключается .NET [Core]: Platform Invoke (P/Invoke).

Andrew Morton 21.08.2024 20:46

«что я предпочитаю не добавлять в свое решение» — добавьте только то, что вам нужно.

rotabor 21.08.2024 21:01

Этот вопрос был соответствующим образом отредактирован. Мы занимаемся проблемами программирования, а не чувствами, и все остальное — это просто метакомментарии и отвлечение от реальной проблемы, которая у вас есть. Размещенные здесь вопросы и ответы предназначены не только для задающего вопроса, но и для помощи другим, столкнувшимся с такой же проблемой. Краткие вопросы помогают другим быстрее понять, является ли их проблема той же самой.

Dalija Prasnikar 21.08.2024 22:18

@DalijaPrasnikar это очень черно-белое, большая часть вашей логики основана на чувствах, хотите верьте, хотите нет, конечно, гораздо больше, чем вы думаете. Я просто осознаю это и проливаю на это свет, так что мы осознаем, а не невежественны. Разделять эти два понятия — просто невежество, особенно при построении сообщества. В любом случае я очень обижаюсь на то, что мои слова редактируют без моего разрешения и удаляют мои комментарии. Я чувствую себя угнетенным.

Eduard G 21.08.2024 23:52

Может быть, просто используйте эту функцию stackoverflow.com/a/73373888/14868997 , чтобы создать Span. Я согласен, что не стоит вовлекаться эмоционально. Будьте беспристрастны и анализируйте проблему, не волнуясь. Что касается чувства угнетения: см. youtube.com/watch?v=YAA-G947ofg

Charlieface 21.08.2024 23:53

См. также этот пакет github.com/VictorNicollet/NoAlloq для LINQ для спанов. Или вы можете создать свои собственные методы расширения.

Charlieface 22.08.2024 00:03
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
17
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От Тим-Мэйс. Добавьте методы для многомерных массивов

    public static T[] GetRow<T>(this T[,] array, int row)
    {
        var rowLength = array.GetLength(1);
        var result = new T[rowLength];
        for (int i = 0; i < rowLength; i++)
        {
            result[i] = array[row, i];
        }
        return result;
    }

Создавать новый массив для каждого доступа крайне неэффективно.

Charlieface 21.08.2024 23:50

Я выбрал это в качестве ответа @Charlieface, так как, к сожалению, я не нашел способа сделать это без создания нового массива. В итоге я сам использовал неровные массивы. Позор C#.

Eduard G 21.08.2024 23:55

Другие вопросы по теме