Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2016, 16:29   #1
quqeiqa2
Пользователь
 
Регистрация: 16.10.2014
Сообщений: 27
По умолчанию C#: StringSplitter

Код:
	using System.Collections.Generic;

	/// <summary> Разделяет строку на части по строке или символу разделителю.
	/// Можно задать мин. длину получаемого массива, тогда если строки закончатся,
	/// остальные элементы будут пустые.
	/// </summary>
	public static class StringSplitter {
		public static unsafe String[] Split(String str, char separator, int minLength = 0) {
			if(separator == '\0')
				return Split(str, minLength);

			List<String> bits = new List<String>(minLength);
				fixed(char* checkStr = str) {
					int length = str.Length;
					int bitStart = 0;

					for(int i = 0; i < length; i++) {
						if(checkStr[i] == separator) {
							bits.Add( (str.Substring(bitStart,i-bitStart)) );
							if(i == length-1) bits.Add("");
							bitStart = i+1;
						} else if(i == length-1) {
							bits.Add( (str.Substring(bitStart,i-bitStart+1)) );
						}
					}
					AddMoreEmptyBits( bits, minLength );
				}
			return bits.ToArray();
		}


		public static unsafe String[] Split(String str, String separator,  int minLength = 0) {
			if(separator.Length < 2)
				return (separator.Length == 1) ? Split(str, separator[0], minLength) : Split(str, minLength);

			List<String> bits = new List<String>(str.Length);
				int length = str.Length;
				int bitStart = 0;
				int separatorMatch = 0;
				int maxSeparatorMatch = separator.Length;
				int i;
				fixed(char* checkStr = str) {
				fixed(char* checkSeparator = separator) {
					
					for(i = 0; i < length; i++) {
						if(checkStr[i] == checkSeparator[separatorMatch]) {
							separatorMatch++;
							if(separatorMatch == maxSeparatorMatch) {
								bits.Add( (str.Substring(bitStart, i-bitStart-maxSeparatorMatch+1)) );
								if(i == length-1) bits.Add("");
								bitStart = i+1;
								separatorMatch = 0;
								continue;
							}
						} else {
							if(i == length-1) {
								bits.Add( (str.Substring(bitStart,i-bitStart+1)) );
								break;
							}
							separatorMatch=0;
						}
					}
					
					AddMoreEmptyBits( bits, minLength );
				}
				}
			return bits.ToArray();
		}


		public static unsafe String[] Split(String str, int minLength) {
			if(minLength < 0) minLength = 0;

			String[] bits = new String[ Math.Max(minLength, str.Length) ];
			int length = str.Length;

			fixed(char* checkStr = str) {
				for(int i = 0; i < length; i++) {
					bits[i] = new String(checkStr[i], 1);
				}
				for(int i = length; i < minLength; i++) {
					bits[i] = "";
				}
			}
			return bits;
		}
		

		static void AddMoreEmptyBits(List<String> bits, int minLength) {
			if(minLength <= 0) return;
			int moreLength = minLength - bits.Count;
			for(int i = 0; i < moreLength; i++) {
				bits.Add("");
			}
		}

	}

Последний раз редактировалось quqeiqa2; 05.01.2016 в 12:59.
quqeiqa2 вне форума Ответить с цитированием
Старый 04.01.2016, 23:29   #2
WorldMaster
Старожил
 
Аватар для WorldMaster
 
Регистрация: 25.08.2011
Сообщений: 2,841
По умолчанию

Блин ... где же строгие модеры?? Что за пост??
в жБАН неплохо бы выписать пользователю за такое оформление.
Skype - wmaster_s E-Mail - WorldMasters@gmail.com
Работаем по 3 критериям - быстро, качественно, недорого. Заказчик выбирает любые два.
WorldMaster вне форума Ответить с цитированием
Старый 05.01.2016, 10:03   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Да вродь норм оформление
или чего не так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц