Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.67/78: Рейтинг темы: голосов - 78, средняя оценка - 4.67
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71

Соединение массива строк

15.04.2010, 00:03. Показов 14341. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите пожалуйста как соединить два массива строк:

C#
1
2
  string[] a1 = Directory.GetFiles(@"c:\test");
  string[] a2 = Directory.GetFiles(@"d:\test");
нужно сохранить в a3 объединение a1+a2, без цикла

например, если a1 = {1,2,3,5}, a2 = {5,7,9}, то a3 должно быть a3 = {1,2,3,5,5,7,9}

а ещё лучше, с исключением повторяющихся
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.04.2010, 00:03
Ответы с готовыми решениями:

Соединение строк
Ребят, подскажите пожалуйста как соединить строку AnsiString Str со строкой(на выбор) из combobox.

Соединение 2-х строк
Условие такое: Заданы две строки. Построить новую строку, состоящую из символов, которые входят как в одну, так и в другую строку. ...

Соединение строк
Всем привет. Появился такой вопрос: почему такое соединение строк не работает: Memo1->Lines->Add("#" + i + " =...

21
 Аватар для HIMen
4340 / 1509 / 101
Регистрация: 12.04.2009
Сообщений: 2,342
15.04.2010, 00:54
C#
1
var r = a1.Concat(a2).Distinct().ToArray();
1
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
15.04.2010, 01:08
C#
1
2
3
4
5
            string[] a1 = new string[] { a, b, c };
            string[] a2 = new string[] { d, e, f };
            string[] a3 = new string[a1.Length + a2.Length];
            Array.Copy(a1, a3, a1.Length);
            Array.Copy(a2, 0, a3, a1.Length, a3.Length);
0
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
15.04.2010, 01:32  [ТС]
Цитата Сообщение от HIMen Посмотреть сообщение
var r = a1.Concat(a2).Distinct().ToArray();
Спасибо, только Distinct не работает почему то

Добавлено через 33 секунды
Цитата Сообщение от Mikant Посмотреть сообщение
C#
1
2
            
            Array.Copy(a2, 0, a3, a1.Length, a3.Length);
Спасибо. Только последняя строчка не a3.Length, a a2.Length

C#
1
2
            
            Array.Copy(a2, 0, a3, a1.Length, a2.Length);
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
15.04.2010, 01:53
да, точно. сорь, опечатался. молодец, что дебажишь!

Добавлено через 2 минуты
для того, чтобы заработал вариант HIMen надо поставить целевую платформу проекта (это в свойствах текущего проекта) в .NET Framework 3.5 и в коде дописать using System.Linq;
1
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
15.04.2010, 02:03  [ТС]
Цитата Сообщение от Mikant Посмотреть сообщение
да, точно. сорь, опечатался. молодец, что дебажишь!

Добавлено через 2 минуты
для того, чтобы заработал вариант HIMen надо поставить целевую платформу проекта (это в свойствах текущего проекта) в .NET Framework 3.5 и в коде дописать using System.Linq;
Ага, я понял уже, затупил что-то немного =)) Все работает! Спасибо большое!
0
 Аватар для Mikant
1322 / 995 / 127
Регистрация: 08.12.2009
Сообщений: 1,299
15.04.2010, 02:11
Цитата Сообщение от ShellArt Посмотреть сообщение
Все работает! Спасибо большое!
лучшее спасибо нам будет, если под постами понажимаешь на кнопку "спасибо" ^_^
1
146 / 118 / 8
Регистрация: 09.03.2010
Сообщений: 150
15.04.2010, 12:36
Я конечно извиняюсь пред уважаемым HIMen но ведь можно еще проще

int[] ints1 = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] ints2 = { 5, 6, 7, 8, 9, 10, 11, 12 };

IEnumerable<int> union = ints1.Union(ints2);
прогнав переменную union циклом foreach получаем последовательность 1,2,3,4,5,6,7,8,9,10,11,12 - без повторов. Добавление ToArray() - по желанию.


Объединение множества (любого числа) массивов - без повторов значений.

C#
1
2
3
4
5
6
7
8
9
10
  
        string[] names1 = { "Алексей", "Петр", "Сергей", "Василий", "Мария", "Ольга" };
        string[] names2 = { "Иван", "Петр", "Алексей", "Алсу", "Наталья", "Андрей", "Яков" };
        string[] names3 = { "Андрей", "Альбина", "Иван", "Олег", "Роберт", "Наталья", "Екатерина" };
        string[] names4 = { "Андрей", "Иван", "Роберт", "Наталья", "Екатерина", "Гузель" };
 
        List<string[]> namesList = new List<string[]> { names1, names2, names3, names4 };
       var allNames =
           namesList.Aggregate(Enumerable.Empty<string>(),
           (current, next) => current.Union(next)).OrderBy(s => s).ToArray();
2
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
15.04.2010, 20:13  [ТС]
А можно сделать так чтобы distinct выполнялся так:

C#
1
2
 
var t = folder1.Concat(Directory.GetFiles(path)).Distinct().ToArray();
Но проблема в том, что folder1 = {"c:\test\1.txt","c:\test\2.txt","c:\tes t\3.txt"}
А Directory.GetFiles(path) = {"d:\test\1.txt","d:\test\5.txt","d:\tes t\3.txt"}

надо без цикла сделать так, чтобы c:\test\ и d:\test\ убрать, и работать уже с именами
0
146 / 118 / 8
Регистрация: 09.03.2010
Сообщений: 150
16.04.2010, 20:55
ShellArt,
насчет имен файлов.
вот это код возвращает мне только имена файлов+расширение - и никаких d:\test\
у меня в комбобокс загружаются все каталоги обоих дисков(в виде путей до папки) - и на выбор любого в соседнем боксе появляется список файлов в данной директории.

C#
1
2
3
4
5
6
7
8
string select = comboD.SelectedValue.ToString();
            DirectoryInfo dir = new DirectoryInfo(select);
            FileInfo[] files = dir.GetFiles();
 
            foreach (FileInfo s in files)
            {
            comboF.Items.Add(s);
            }
методы DirectoryInfo и Directory немного отличаются в своих результатах
скажем вот это
C#
1
string[] subdir = Directory.GetDirectories(@"D:\");
возвращает путь до папки с указанием буквы диска.
а вот это
C#
1
2
DirectoryInfo dir = new DirectoryInfo("D:\\");
DirectoryInfo[] subdir3 = dir.GetDirectories();
без указания буквы диска
к тому ж - при попытке доступа на С выдает исключение.
В общем выбирай нужный вариант, благо в C# их масса.
0
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
16.04.2010, 21:14
Цитата Сообщение от erlik Посмотреть сообщение
Я конечно извиняюсь пред уважаемым HIMen но ведь можно еще проще
int[] ints1 = { 1, 2, 3, 4, 5, 6, 7, 8 };
int[] ints2 = { 5, 6, 7, 8, 9, 10, 11, 12 };
IEnumerable<int> union = ints1.Union(ints2);
оно то конечно проше но по производительности как тестировали?
0
146 / 118 / 8
Регистрация: 09.03.2010
Сообщений: 150
16.04.2010, 21:23
Sergei,
ну конечно не тестил -я просто еще один вариант написал - если есть дефолтный метод, который делает то что нужно - то почему бы его тоже не привести в качестве примера?
а выбор конкретного метода уже за тем кому это надо. Нам новичкам в конце концов не до тестов производительности - это вы матерые кодеры все учитываете - а мы же пока учим базу.
0
 Аватар для Sergei
1513 / 780 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
16.04.2010, 21:30
erlik, Все правильно пример у Вас интересный и хороший! но потихоньку пытайтесь вникать по глубже, опыта наберетесь я же написал не для того чтобы сказать, что мол вы дали плохой пример,
из интереса хотел сравнить по производительности, так как изучаю LINQ технологию
0
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
16.04.2010, 22:52  [ТС]
Цитата Сообщение от erlik Посмотреть сообщение
ShellArt,
возвращает путь до папки с указанием буквы диска.
а вот это
C#
1
2
DirectoryInfo dir = new DirectoryInfo("D:\\");
DirectoryInfo[] subdir3 = dir.GetDirectories();
без указания буквы диска
Я пробовал подобный вариант:

C#
1
2
3
4
5
6
7
8
      
System.IO.DriveInfo di1 = new System.IO.DriveInfo(@"С:\");
            System.IO.DirectoryInfo dirInfo1 = di1.RootDirectory;
            System.IO.FileInfo[] files1 = dirInfo1.GetFiles(@"test\");
 
      System.IO.DriveInfo di1 = new System.IO.DriveInfo(@"D:\");
            System.IO.DirectoryInfo dirInfo1 = di1.RootDirectory;
            System.IO.FileInfo[] files2 = dirInfo1.GetFiles(@"test\");
но проблема в том, что files1 типа FileInfo[], и так сделать не прокатит:

C#
1
var r = files1.Except(files2).ToArray();
мне нужно по возможности исключить всякие циклы, так как задача требует работу со случаями, когда в каталоге 10000 файлов и более, поэтому хочу сделать без циклов.

Добавлено через 2 минуты
Цитата Сообщение от Sergei Посмотреть сообщение
erlik,
из интереса хотел сравнить по производительности, так как изучаю LINQ технологию
Я тоже изучаю LINQ, но не могу найти нигде, как решить проблему, описанную мной выше, может вы подскажите?
0
146 / 118 / 8
Регистрация: 09.03.2010
Сообщений: 150
16.04.2010, 23:25
ShellArt,
почему не прокатит?

C#
1
2
3
4
5
6
7
8
9
10
11
DirectoryInfo dir = new DirectoryInfo(@"D:\test");
         FileInfo[] files = dir.GetFiles();
         DirectoryInfo dir2 = new DirectoryInfo(@"C:\Мои документы");
         FileInfo[] files2 = dir2.GetFiles();
 
         var символ = files.Except(files2).ToArray();;
 
         foreach (var ch in символ)
         {
             Console.WriteLine(ch);
         }
единственная проблема - что нельзя указать просто диск С без папки - у меня всегда выдает исключение.
или я чего недопонимаю?

Тьфу ты блин - этот вариант у меня тоже исключение выдает - я там оказывается ошибочку допустил и к диску С у меня опять доступа нет.

Хотя нет - просто указал несуществующую папку- а так все работает.

ну еще есть вариант убрать все ненужные части из пути через Remove()
я однажды примерно так убирал для своего плеера
C#
1
2
3
4
5
6
7
string[] names = Directory.GetFiles(@"D:\test");
        string [] filename = new string [names.Length]; 
        for (int i=0;i<names.Length; i++)
            {
                filename[i]= names[i].Remove(0, names[i].LastIndexOf("\\") + 1);
               
            }
0
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
16.04.2010, 23:49  [ТС]
Цитата Сообщение от erlik Посмотреть сообщение
почему не прокатит?.......................

попробовал, в результате он выводит содержимое files, но не результат операции вычитания

Добавлено через 2 минуты
А второй вариант с циклом, я делал только через foreach, но в том то и задача сделать это без цикла
0
146 / 118 / 8
Регистрация: 09.03.2010
Сообщений: 150
17.04.2010, 00:20
ShellArt,
а что нужно?
вот это
C#
1
2
3
4
5
6
7
8
         int[] numbers1 = { 1, 2, 3, 3, 4, 5 };
         int[] numbers2 = { 2,3,4,5,6 };
 
         IEnumerable<int> onlyInFirstSet = numbers1.Except(numbers2);
         foreach (int number in onlyInFirstSet)
         {
             Console.WriteLine(number);
         }
выведет только 1- так как этого числа нет в другом множестве и найдя его функция сразу же прекращает свое действие. Не замечая что есть еще 6.
Цитата
"Данный метод возвращает только те элементы последовательности first, которых нет в последовательности second. Он не возвращает элементы последовательности second, не входящие в последовательность first."
Вам какое именно действие нужно произвести? я уже запутался что надо то...
0
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
17.04.2010, 00:45  [ТС]
Цитата Сообщение от erlik Посмотреть сообщение
ShellArt,
выведет только 1- так как этого числа нет в другом множестве и найдя его функция сразу же прекращает свое действие. Не замечая что есть еще 6.
Цитата
"Данный метод возвращает только те элементы последовательности first, которых нет в последовательности second. Он не возвращает элементы последовательности second, не входящие в последовательность first."
Вам какое именно действие нужно произвести? я уже запутался что надо то...
В общем, есть 2 папки, нужно узнать каких файлов нет во второй папке, то есть как раз операция разности, только их нужно скопировать, а во второй папке узнать с помощью той же операции, какие файлы удалить, тем самым выполнив одностороннюю синхронизацию
0
146 / 118 / 8
Регистрация: 09.03.2010
Сообщений: 150
17.04.2010, 01:00
нужно узнать каких файлов нет во второй папке
в этом случае Except как раз делает что должен
C#
1
2
3
4
5
6
7
8
   [] n1 = { "иван","александр", "мария","андрей"};
         string[] n2 = { "иван", "александр", "aлеkсей", "наталья" };
 
         var f = n1.Except(n2);
         foreach (var ch in f)
         {
             Console.WriteLine(ch);
         }
получаем "мария" и"андрей" которых нет во втором массиве.
из этих массивов
string[] n1 = { "иван","александр", "мария","андрей"};
string[] n2 = { "aлеkсей", "наталья","сергей" };
найдет отсутствующие во втором "иван","александр", "мария","андрей" .

далее не очень понял - мозги уже не работают
0
11 / 11 / 1
Регистрация: 21.03.2010
Сообщений: 71
17.04.2010, 02:25  [ТС]
Цитата Сообщение от erlik Посмотреть сообщение
далее не очень понял - мозги уже не работают
А дальше проблема с именами файлов, d:\test\ и c\test\ надо из массива файлов убрать путь, указанный пользователем. Потому что d:\test\1.txt и c:\test\1.txt это разные имена
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.04.2010, 02:25
Помогаю со студенческими работами здесь

Соединение строк в c++
В C# Есть возможность делать строку из двух слов, к примеру - Display(&quot;\nXResolution = &quot; + WindowVector.x); В итоге в окне...

Соединение строк
Необходимо соединить строки следующим образом: Из входного потока читается несколько строк. В первой строке вводится число N -...

Форматированное соединение строк
Есть набор строчек. Их надо соединить в одну строчку, причем, способ соединения задать на стадии исполнения, а не на стадии компиляции....

Неправильное соединение строк
Существует файл со списком сайтов(типа каждый сайт с новой строки). Нужно перебрать все сайты и обернуть их в скобки и другие символы. Но...

Соединение двух строк
Из входного потока читается несколько строк. В первой строке вводится число N - количество оставшихся строк (тестов). В каждой из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru