Как заменить определенный элемент в массиве С#
Я хочу заменить определенный элемент в массиве, но текущий метод заменяет только все элементы.
Например, если я хочу заменить «q» на «w»:
Это заменит все «q» на «w». Я просто хочу заменить только третий «q». Как бы я это сделал?
2 ответа
Во-первых, ваш код недействителен. должно быть как — зависит от вашей версии С#:
Впрочем, вернемся к вашему вопросу.
Чтобы что-то сделать с определенными элементами коллекции, вам нужно знать некоторый идентификатор (уникальная спецификация для каждого элемента, например idNo, indexNo и т. д.).
В вашем примере, поскольку это массив строк, нет другого идентификатора, кроме индекса элементов.
Таким образом, вы можете просто редактировать определенные элементы с помощью
How do I replace an item in a string array?
Using C# how do I replace an item text in a string array if I don’t know the position?
My array is [berlin, london, paris] how do I replace paris with new york?
2 Answers 2
You need to address it by index:
Since you say you don’t know the position, you can use Array.IndexOf to find it:
You could also do it like this:
-
The Overflow Blog
Linked
Related
Hot Network Questions
Subscribe to RSS
To subscribe to this RSS feed, copy and paste this URL into your RSS reader.
Site design / logo © 2023 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2023.3.11.43304
By clicking “Accept all cookies”, you agree Stack Exchange can store cookies on your device and disclose information in accordance with our Cookie Policy.
Быстрый способ замены элементов в массиве — C
Я бы хотел заменить все элементы, которые имеют значение 1 с другим значением, например 123456.
Это может быть тривиально реализовано с помощью:
Из любопытства, есть ли более быстрый способ сделать это, каким-то хитростью x86, или это лучший код для процессора?
Это может оказаться быстрее.
EDIT: Изменена побитовая операция для сдвига влево.
В вашем конкретном случае, когда вы изначально имели 0 и 1, следующее может быть быстрее. Вам нужно будет это обозначить. Вы, вероятно, не можете сделать намного лучше с простым C, хотя; вам может понадобиться погрузиться в сборку, если вы хотите воспользоваться «обманом x86», который может существовать.
Код контрольной точки:
мои результаты:
Компьютер: четырехъядерный процессор AMD Phenom @2.5GHz, Linux, GCC 4.7, скомпилированный с
Для небольшого массива, такого как ваш, нет смысла пытаться найти другой алгоритм, и если значения не находятся в определенном шаблоне, простой цикл — это единственный способ сделать это в любом случае.
Однако, если у вас очень большой массив (мы говорим о нескольких миллионах записей), вы можете разделить работу на потоки. Каждый отдельный поток обрабатывает меньшую часть всего набора данных.
Вы также можете сравнить это:
Я запускаю его через те же тесты, что и SchighSchagh, с небольшой или никакой разницей в моей настройке. Однако он может отличаться от вашего.
РЕДАКТИРОВАТЬ: Остановить прессы!
Я только что вспомнил, что x86 может «разворачивать» троичные операторы, если аргументы между «:» — это константы. Рассмотрим следующий код:
Похоже на ваш оригинальный код, не так ли? Хорошо, демонтаж показывает, что он был скомпилирован без каких-либо ветвей:
По производительности это кажется на первый взгляд или немного лучше, чем мое оригинальное решение SchighSchagh. Это более читаемо и более гибко. Например, он может работать с массивом [i] со значениями, отличными от 0 и 1.
Нижняя строка, контрольная точка И загляните в разборку.
Массив достаточно мал, чтобы он входил в кеш, поэтому стоит использовать SIMD: (не проверено)
Возможно, разворачивается на 2.
Если у вас SSE4.1, вы можете использовать трюк ShighSchagh с pmulld .
Здесь некоторый код Win32 для профилирования различных версий алгоритма (скомпилированный с использованием VS2010 Express с использованием сборки по умолчанию): —
Он получил для тестов: C с использованием if(). , C с использованием множительной версии harold simd и моей версии simd.
Запуск много раз (помните, что при профилировании вы должны усреднять результаты по нескольким прогонам), разница между всеми версиями, кроме ветвящейся, значительно меньше.
Это не удивительно, так как algortihm делает очень мало работы для каждого элемента памяти. Это означает, что реальным лимитирующим фактором является пропускная способность между ЦП и памятью, процессор постоянно ждет, пока память догонит, даже когда процессор помогает предварительно запрограммировать данные (данные ia32 определяют и предварительно отбирают данные линейно).
Вы можете использовать другой массив или какую-либо другую структуру данных, чтобы отслеживать индексы элементов, которые вы установили в один, а затем только посещать эти элементы. Это будет работать лучше всего, если только несколько элементов, которые установлены на один
еще один способ ускорить назначение массива, вы можете использовать встроенную сборку c. Как ниже,
Это должно быть скорость, когда мы сравнивали с простой программой c для назначения значений массива. А также команда stosl занимает 4 такта.
Как заменить элемент массива c
Все массивы в C# построены на основе класса Array из пространства имен System. Этот класс определяет ряд свойств и методов, которые мы можем использовать при работе с массивами. Основные свойства и методы:
Свойство Length возвращает длину массива
Свойство Rank возвращает размерность массива
int BinarySearch (Array array, object? value) выполняет бинарный поиск в отсортированном массиве и возвращает индекс найденного элемента
void Clear (Array array) очищает массив, устанавливая для всех его элементов значение по умолчанию
void Copy (Array sourceArray, int sourceIndex, Array destinationArray, int destinationIndex, int length) копирует из массива sourceArray начиная с индекс sourceIndex length элементов в массив destinationArray начиная с индекса destinationIndex
bool Exists<T> (T[] array, Predicate<T> match) проверяет, содержит ли массив array элементы, которые удовлеворяют условию делегата match
void Fill<T> (T[] array, T value) заполняет массив array значением value
T? Find<T> (T[] array, Predicate<T> match) находит первый элемент, который удовлеворяет определенному условию из делегата match. Если элемент не найден, то возвращается null
T? FindLast<T> (T[] array, Predicate<T> match) находит последний элемент, который удовлеворяет определенному условию из делегата match. Если элемент не найден, то возвращается null
int FindIndex<T> (T[] array, Predicate<T> match) возвращает индекс первого вхождения элемента, который удовлеворяет определенному условию делегата match
int FindLastIndex<T> (T[] array, Predicate<T> match) возвращает индекс последнего вхождения элемента, который удовлеворяет определенному условию
T[] FindAll<T> (T[] array, Predicate<T> match) возвращает все элементы в виде массива, которые удовлеворяет определенному условию из делегата match
int IndexOf (Array array, object? value) возвращает индекс первого вхождения элемента в массив
int LastIndexOf (Array array, object? value) возвращает индекс последнего вхождения элемента в массив
void Resize<T> (ref T[]? array, int newSize) изменяет размер одномерного массива
void Reverse (Array array) располагает элементы массива в обратном порядке
void Sort (Array array) сортирует элементы одномерного массива
Разберем самые используемые методы.
Поиск индекса элемента
Если элемент не найден в массиве, то методы возвращают -1.
Поиск элемента по условию
Изменение порядка элементов массива
Например, изменим порядок элементов:
Также можно изменить порядок только части элементов:
В данном случае изменяем порядок только 3 элементов начиная c индекса 1.
Изменение размера массива
Для изменения размера массива применяется метод Resize. Его первый параметр — изменяемый массив, а второй параметр — количество элементов, которые должны быть в массиве. Если второй параметр меньше длины массива, то массив усекается. Если значение параметра, наоборот, больше, то массив дополняется дополнительными элементами, которые имеют значение по умолчанию. Причем первый параметр передается по ссылке:
Копирование массива
Метод Copy копирует часть одного массива в другой:
В данном случае копируем 3 элемента из массива people начиная c индекса 1 и вставляем их в массив employees начиная с индекса 0.
Сортировка массива
Отсортируем массив с помощью метода Sort() :
Этот метод имеет много перегрузок. Например, одна из версий позволяет отсортировать только часть массива: