Есть ли в .NET 2.0 встроенная функция, которая будет принимать два массива и объединять их в один массив?
Массивы имеют одинаковый тип. Я получаю эти массивы из широко используемой функции в моей базе кода и не могу изменить функцию, чтобы она возвращала данные в другом формате.
Я стараюсь не писать свою собственную функцию для достижения этой цели, если это возможно.
Array.Resize
самом деле не изменяет размер массива, он копирует его. Вот почему первым параметром является by-ref (что означает, что ваш первый код, вероятно, не будет компилироваться).В C # 3.0 вы можете использовать метод Concat LINQ, чтобы легко это сделать:
В C # 2.0 у вас нет такого прямого пути, но Array.Copy, вероятно, является лучшим решением:
Это может быть легко использовано для реализации вашей собственной версии
Concat
.источник
Используйте LINQ :
Имейте в виду, это удалит дубликаты. Если вы хотите сохранить дубликаты, используйте Concat.
источник
Если вы не хотите удалять дубликаты, попробуйте это
Используйте LINQ:
источник
Во-первых, убедитесь, что вы задаете себе вопрос «Должен ли я действительно использовать массив здесь»?
Если вы не создаете что-то, где скорость имеет первостепенное значение, возможно, вам понадобится печатный список, например
List<int>
. Единственный раз, когда я использую массивы, это байтовые массивы при отправке данных по сети. Кроме этого, я никогда не прикасаюсь к ним.источник
List<T>
в общедоступных API-интерфейсах: blogs.msdn.com/b/kcwalina/archive/2005/09/26/474010.aspxПроще было бы просто использовать LINQ :
Сначала конвертируйте массивы в списки и объединяйте их ... После этого просто конвертируйте список обратно в массив :)
источник
Я думаю, что вы можете использовать Array.Copy для этого. Он принимает исходный индекс и целевой индекс, так что вы сможете добавить один массив к другому. Если вам нужно выполнить более сложную задачу, чем просто добавить одно к другому, это может оказаться не подходящим инструментом для вас.
источник
Предполагая, что массив назначения имеет достаточно места,
Array.Copy()
будет работать. Вы также можете попробовать использовать методList<T>
и его.AddRange()
метод.источник
Лично я предпочитаю свои собственные языковые расширения, которые я добавляю или удаляю по желанию для быстрого создания прототипов.
Ниже приведен пример для строк.
Это намного быстрее, чем LINQ и Concat. Более того, используется пользовательская
IEnumerable
оболочка типа, которая хранит ссылки / указатели переданных массивов и позволяет циклически перемещаться по всей коллекции, как если бы это был обычный массив. (Полезно в HPC, обработка графики, рендеринг графики ...)Ваш код:
Полный код и дженериковую версию см. По адресу : https://gist.github.com/lsauer/7919764.
Примечание: это возвращает нерасширенный объект IEnumerable. Возвращать расширенный объект немного медленнее.
Я скомпилировал такие расширения с 2002 года, и многие из них были полезны людям, работающим с CodeProject и Stackoverflow. Я выпущу их в ближайшее время и выложу ссылку здесь.
источник
Каждый уже высказал свое мнение, но я думаю, что это более читабельно, чем подход «использовать как метод расширения»:
Однако его можно использовать только при объединении двух массивов.
источник
Это то, что я придумал. Работает для переменного числа массивов.
...
источник
Просто чтобы это было отмечено как опция: если массивы, с которыми вы работаете, имеют примитивный тип - Boolean (bool), Char, SByte, Byte, Int16 (short), UInt16, Int32 (int), UInt32, Int64 (long ), UInt64, IntPtr, UIntPtr, Single или Double - тогда вы можете (или должны?) Попробовать использовать Buffer.BlockCopy . Согласно странице MSDN для класса Buffer :
Используя пример C # 2.0 из ответа @ OwenP в качестве отправной точки, он будет работать следующим образом:
Между синтаксисом
Buffer.BlockCopy
и тем,Array.Copy
что используется @OwenP, почти нет различий , но это должно быть быстрее (хотя бы незначительно).источник
В случае, если кто-то ищет, как объединить два байтовых массива изображения:
источник
Вот простой пример использования Array.CopyTo. Я думаю, что он отвечает на ваш вопрос и дает пример использования CopyTo - я всегда озадачен, когда мне нужно использовать эту функцию, потому что помощь немного неясна - индекс - это позиция в целевом массиве, где происходит вставка.
Я думаю, вы не можете сделать это намного проще.
источник
Мне нужно решение, чтобы объединить неизвестное количество массивов.
Удивило, что никто другой не предоставил решение с
SelectMany
помощьюparams
.Если вы не хотите, чтобы отдельные элементы были удалены.
Примечание. Определенно нет никаких гарантий при заказе.
источник
Я предполагаю, что вы используете свои собственные типы массивов, а не встроенные массивы .NET:
Другой способ сделать это - использовать встроенный класс ArrayList.
Оба примера являются C #.
источник
Используя приведенный выше код, два массива можно легко объединить.
источник
Создан и метод расширения для обработки нуля
источник
Если у вас есть исходные массивы в самом массиве, вы можете использовать SelectMany :
дает
Вероятно, это не самый быстрый метод, но может подойти в зависимости от варианта использования.
источник
Этот код будет работать для всех случаев:
источник
Попробуй это:
источник