Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277

Разделить строку на 3,4 и 6 частей

04.12.2015, 09:49. Показов 3112. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть строка qwertyuiopasdfghjklzxcvbnm1234567890qwer tyuiop ее нужно разделить на 3,4 и 6 частей. Строки могут быть не одинаковые по размеру, количество символов в строке не известно. На 2 части понятно как
C#
1
2
3
4
5
6
7
string all = "qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiop ";
            string a;
            string b;
            string c;
            string d;
            a = all.Substring(0, all.Length/2);
            b = all.Substring(all.Length/2, all.Length/2);
На 3 части такой метод походу не подходит.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.12.2015, 09:49
Ответы с готовыми решениями:

Равномерно разделить строку на n частей
Как равномерно разделить строку из сотен знаков на 20 частей? Т.е. имеется массив string: string SMD = new string; и строка...

Разделить одну строку на несколько частей одним махом
есть строка: //"Stossdämpfer Federbein hinten links Ford MondeoEUR 54,00Versand:KostenlosRestzeit:21T0Std59Min"; 1-разделение...

Разделить строку на несколько частей
Функция создания таблицы: void tableCreate(String ab, String bb,String gg) { ScrollView sv = new ScrollView(this); ...

20
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
04.12.2015, 10:07
inject,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main()
        {
            var s = Console.ReadLine();
            foreach (var temp in SplitIntoPieces(s, 3)) //Вместо 3 можешь поставить любое число
                Console.WriteLine(temp);
            Console.ReadKey();
        }
        private static IEnumerable<string> SplitIntoPieces(string s, int count)
        {
            if (string.IsNullOrEmpty(s) || count < 1 || count > s.Length)
                yield break;
            var splitSize = s.Length/count;
            for (var i = 0; i < count; ++i)
                yield return s.Substring(i*splitSize, splitSize);
            if (count*splitSize != s.Length)
                yield return s.Substring(count*splitSize);
        }
    }
}
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 10:14  [ТС]
Как потом эти 3,4 и 6 частей переменным присвоить ?
0
78 / 77 / 52
Регистрация: 11.06.2015
Сообщений: 189
04.12.2015, 11:29
inject, вам функция nestquik2 выводит коллекцию ваших изрезанных строк. Можете пройтись поэлементно по этой коллекции и сделать нужные присваивания.
0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 12:23  [ТС]
Цитата Сообщение от WinDev Посмотреть сообщение
Можете пройтись поэлементно по этой коллекции и сделать нужные присваивания.
Как именно ? Дело в том, что если количество строк не четное, то вместо 4 строк выходит 4 в которой только 1 символ.
0
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
04.12.2015, 14:32
inject, Вы имеете ввиду, что если ввести строку "абвгд" и сделать 3 части от неё, то на выходе должны получить: "аб", "вг", "д"?, А если ввести "абвгдеж"(3) то на выходе получаем: "аб", "вг", "деж"? Если так, то я сейчас поправлю функцию
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 15:00  [ТС]
Цитата Сообщение от nestquik2 Посмотреть сообщение
Вы имеете ввиду, что если ввести строку
Ага. Вот пример. Делю на 3 части. По возможности пусть последний символ записывается в последнюю строку. Может еще подскажите, как эти части переменным присвоить ?
0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 15:02  [ТС]
Выше ссылку побило.
Миниатюры
Разделить строку на 3,4 и 6 частей  
0
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
04.12.2015, 15:54
Лучший ответ Сообщение было отмечено inject как решение

Решение

inject,
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System;
using System.Collections.Generic;
namespace ConsoleApplication1
{
    internal class Program
    {
        private static void Main()
        {
            string s;
            while (!string.IsNullOrEmpty(s = Console.ReadLine()))
            foreach (var temp in SplitIntoPieces(s, 3))
                Console.WriteLine(temp);
            Console.ReadKey();
        }
        private static IEnumerable<string> SplitIntoPieces(string s, int count)
        {
            if (string.IsNullOrEmpty(s) || count < 1 || count > s.Length)
                yield break;
            var splitSize = (double)s.Length / count;
            var processedLength = 0.0;
            for (int i = 0, currentStart = 0; i < count; ++i)
            {
                processedLength += splitSize;
                var currentEnd = (int)Math.Round(processedLength);
                yield return s.Substring(currentStart, currentEnd - currentStart);
                currentStart = currentEnd;
            }
        }
    }
}
Вот результаты по Вашему примеру:
0
Заблокирован
04.12.2015, 16:39
nestquik2, и все же это не идеальный результат, если уж придираться так придираться т.е. например если s.Length = 10 и count = 3 то должны возвращаться строки длинами: 4, 3, 3 (логически будет самое верное имхо), а если s.Length = 11 и count = 3 то должны возвращаться строки длинами: 3, 3, 3, 2 (т.е. все время поровну и по убыванию длины)

я сделал вот такой вариант:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public static class Extensions
{
    public static IEnumerable<string> Split(this string s, int count)
    {
        if (string.IsNullOrEmpty(s))
            yield break;
 
        var length = s.Length / count;
        var tailLength = 0;
        var isTail = s.Length % count != 0;
 
        if (s.Length < length * 2)
        {
            yield return s;
            yield break;
        }
 
        var reverseOrder = false;  
 
        if (isTail)
        {
            length++;
            tailLength = length - (length * count - s.Length);
 
            var rest = length - tailLength;
 
            if (rest > 1)
            {
                length--;
                tailLength += rest;
                reverseOrder = true;
            }
        }
 
        var tailIndex = reverseOrder ? s.Length : s.Length - tailLength;
        var i = reverseOrder ? tailLength : 0;
 
        if (isTail && reverseOrder)
            yield return s.Substring(0, tailLength);
 
        for (; i < tailIndex; i += length)
            yield return s.Substring(i, length);
 
        if (isTail && !reverseOrder)
            yield return s.Substring(tailIndex);
    }
}
Добавлено через 1 минуту
использовать так:
C#
1
var split = "0123456789".Split(3).ToArray(); // { "0123", "456", "789" }
0
04.12.2015, 16:40

Не по теме:

Цитата Сообщение от Volrajas Посмотреть сообщение
C#
1
2
3
4
5
      var i = reverseOrder ? tailLength : 0;
      if (isTail && reverseOrder)
            yield return s.Substring(0, tailLength);
      for (; i < tailIndex; i += length)
            yield return s.Substring(i, length);
чего же ты его не добавил прям в инициализацию цикла? Да и называть метод стандартным названием, не ок

0
Заблокирован
04.12.2015, 16:46
Цитата Сообщение от nestquik2 Посмотреть сообщение
чего же ты его не добавил прям в инициализацию цикла?
так лаконичней, получилась бы слишком длинная строка, всего лишь вопрос стиля кода

Добавлено через 3 минуты
Цитата Сообщение от nestquik2 Посмотреть сообщение
Да и называть метод стандартным названием, не ок
с чего то взял? по моему как раз так лучше

Добавлено через 49 секунд

Не по теме:

тем не менее это все придирки к стилю кода, а по сути мой алгоритм работает лучше 8-)

0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 16:58  [ТС]
Цитата Сообщение от nestquik2 Посмотреть сообщение
Вот результаты по Вашему примеру:
Разделить строку на 3,4 и 6 частей
Спасибо работает. Подскажите теперь, как это все можно переменным присвоить ? Все 3 и каждая свое переменной ?
0
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
04.12.2015, 16:59
inject, используй вместо переменных List или Array
0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 18:15  [ТС]
Цитата Сообщение от nestquik2 Посмотреть сообщение
используй вместо переменных List или Array
Проблема в том, что нужно именно в переменные (
0
Заблокирован
04.12.2015, 18:40
Цитата Сообщение от inject Посмотреть сообщение
Проблема в том, что нужно именно в переменные (
что за бред ты несешь? получил массив - разложил в переменные
C#
1
2
3
4
var split = "0123456789".Split(3).ToArray(); // { "0123", "456", "789" }
a = split[0];
b = split[1];
// ...
1
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
04.12.2015, 19:56  [ТС]
Цитата Сообщение от Volrajas Посмотреть сообщение
что за бред ты несешь?
Хорошо. Что тогда я делаю не так ?
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void button1_Click(object sender, EventArgs e)
        {
            string all = "qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiop";
            string s;
            while (!string.IsNullOrEmpty(all))
                foreach (var temp in SplitIntoPieces(all, 3))
           var split = temp.Split(3).ToArray(); // { "0123", "456", "789" }
        }
        private static IEnumerable<string> SplitIntoPieces(string s, int count)
        {
            if (string.IsNullOrEmpty(s) || count < 1 || count > s.Length)
                yield break;
            var splitSize = (double)s.Length / count;
            var processedLength = 0.0;
            for (int i = 0, currentStart = 0; i < count; ++i)
            {
                processedLength += splitSize;
                var currentEnd = (int)Math.Round(processedLength);
                yield return s.Substring(currentStart, currentEnd - currentStart);
                currentStart = currentEnd;
            }
        }
Ошибка на
C#
1
var split = "0123456789".Split(3).ToArray()
на "3" идет.
0
 Аватар для Sigin
226 / 225 / 112
Регистрация: 20.10.2013
Сообщений: 808
04.12.2015, 21:06
inject,
Цитата Сообщение от inject Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private void button1_Click(object sender, EventArgs e)
        {
            string all = "qwertyuiopasdfghjklzxcvbnm1234567890qwertyuiop";
            string s;
            while (!string.IsNullOrEmpty(all))
                foreach (var temp in SplitIntoPieces(all, 3))
           var split = temp.Split(3).ToArray(); // { "0123", "456", "789" }
        }
        private static IEnumerable<string> SplitIntoPieces(string s, int count)
        {
            if (string.IsNullOrEmpty(s) || count < 1 || count > s.Length)
                yield break;
            var splitSize = (double)s.Length / count;
            var processedLength = 0.0;
            for (int i = 0, currentStart = 0; i < count; ++i)
            {
                processedLength += splitSize;
                var currentEnd = (int)Math.Round(processedLength);
                yield return s.Substring(currentStart, currentEnd - currentStart);
                currentStart = currentEnd;
            }
        }
Все что только можно намешал?
0
Заблокирован
04.12.2015, 21:08
Цитата Сообщение от inject Посмотреть сообщение
Хорошо. Что тогда я делаю не так ?
намешал все что можно используй либо код nestquik2 либо мой (мой отдельным классом надо вынести как у меня сделано в сообщении)
0
2 / 2 / 2
Регистрация: 03.07.2014
Сообщений: 277
05.12.2015, 14:14  [ТС]
Цитата Сообщение от nestquik2 Посмотреть сообщение
Все что только можно намешал?
Пытался твой код вывести ) Другой код даже не понял, как использовать ) Как твой вывести в переменные ?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
05.12.2015, 14:14
Помогаю со студенческими работами здесь

На сколько частей и как нужно разделить отрезок, чтобы произведение длин частей было максимальным
Помогите написать вот такую программу. Не могу ничего придумать. Может методом перебора или еще как-нибудь. На сколько частей и как...

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

Разделить XML на несколько частей
Всем привет. Имеется большой XML-файл (около 20 тысяч строчек) и его необходимо разбить на несколько мелких. Как это можно сделать с...

Разделить изображение на несколько частей
Здравствуйте! Мне нужно разделить изображение на несколько частей по пикселям(или ещё как-то, хотя я и не представляю как) и вставить...

Разделить Книгу с ссылками на 16 частей.
Здравствуйте! Вообщем есть файл ~30мб, это огромный прайс, состоит из 1000+ листов. Около 200 листов навигации, остальное прайсы. ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru