Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Число вхождений символа в строку / 12 сообщений из 12, страница 1 из 1
28.10.2014, 21:58
    #38789888
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Ну т.е. для вычисления напр. к-ва запятых

aaa,bbb,ccc,ddd

А есть готовая ф-ция?

В VB6 годами использовал свою конструкцию

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Public Function ChNum(ByVal the_str As String, ch As String) As Integer
  'Возвращает число символов в строчке
  'задумано пока, что ch состоит из одного символа
  ChNum = 0
  Do
    If InStr(the_str, ch) = 0 Then
      Exit Do
    Else
      the_str = Right(the_str, Len(the_str) - InStr(the_str, ch))
      ChNum = ChNum + 1
    End If
  Loop
End Function


Оно и в .Net без замены кода прокатит конечно.

Не думая долго с учетом нек. опыта накалякал
Код: vbnet
1.
2.
3.
  Public Function ChNum(ByVal the_str As String, ByVal the_delim As String) As Integer
    Return UBound(Split(the_str, the_delim))
  End Function



Даже больше одного символа в the_delim будет работать.
Тупые варианты типа chnum ("2222222222222","222") не рассматриваем.

А совсем готовое что-то есть?
...
Рейтинг: 0 / 0
28.10.2014, 22:04
    #38789894
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Дмитрий77В VB6 годами использовал свою конструкциюя годами использовал
Код: c#
1.
Len(a)-Len(Replace(a,",","")
...
Рейтинг: 0 / 0
28.10.2014, 22:20
    #38789914
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Shocker.Pro,

Как думаешь, для одного символа твое быстрее чем то что я придумал со Split?

Пофиг наверно. Я ж с короткими строками работаю.

Для нескольких
aaa@@bbb@@ccc@@ddd
твое надо делить на len(@@), а это заморочки
Хотя речь сейчас об одном символе.

Не, но неужели готовой ф-ции нету?
Число вхождений substring в string?
...
Рейтинг: 0 / 0
28.10.2014, 22:27
    #38789919
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Дмитрий77твое надо делить на len(@@), а это заморочки
целая команда процессора.
не бери в голову
...
Рейтинг: 0 / 0
28.10.2014, 22:42
    #38789930
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
если в подстроке символ один, можно использовать Count из LinQ

можно использовать регулярки

думаю, что оба способа будут медленнее, чем банальный Replace
...
Рейтинг: 0 / 0
28.10.2014, 22:54
    #38789941
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Дмитрий77Не, но неужели готовой ф-ции нету?
Число вхождений substring в string?
Готовой нет. Видимо в MS решили что это редкая задача.

У решений через Split и Replace одинаковый недостаток - лишние временные объекты. Они короткоживущие и сборщик мусора их быстро удалит. Однако я бы предпочел решение без них. Например так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Function ChNum(ByVal str As String, ByVal ch As Char) As Integer
	Dim count As Integer = 0
	For I As Integer = 0 To str.Length-1
		If str(I) = ch Then count += 1
	Next
	Return count
End Function

Function ChNum(ByVal str As String, ByVal find As String) As Integer
	Dim count As Integer = 0, idx As Integer
	Do 
		idx = str.IndexOf(find, idx)
		If idx>=0 Then
			count += 1
			idx += find.Length
		End If
	Loop While idx>=0
	Return count
End Function
...
Рейтинг: 0 / 0
28.10.2014, 23:59
    #38790001
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
bazileУ решений через Split и Replace одинаковый недостаток - лишние временные объекты. Они короткоживущие и сборщик мусора их быстро удалит.
А не перебираешь со сборщиком мусора?
Ведь в VB6 код такой же и нет там никакого сборщика.
Что бы там внутри ChNum не создавалось, все это удалится по завершении работы ChNum, разве не так?
...
Рейтинг: 0 / 0
29.10.2014, 00:20
    #38790011
bazile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Дмитрий77Что бы там внутри ChNum не создавалось, все это удалится по завершении работы ChNum, разве не так?
Не так. В .NET используется недетермированная модель управления памятью. Это означает что мы не знаем когда именно память выделенная в управляемой куче будет освобождена. Кроме того дело не в том когда именно будет освобождена память. Сборка мусора является одним из узких мест в .NET приложениях. Поэтому если возможность переписать код без лишних выделений памяти, то следует ей воспользоваться.

Дмитрий77А не перебираешь со сборщиком мусора?
Мой совет в какой-то мере является преждевременной оптимизацией. Реальный эффект на скорость приложения зависит от частоты вызовов функции ChNum.

Дмитрий77Ведь в VB6 код такой же и нет там никакого сборщика.
А в .NET есть и надо знать как он работает и какое влияние оказывает на приложениею
...
Рейтинг: 0 / 0
29.10.2014, 00:46
    #38790021
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
bazileзависит от частоты вызовов функции ChNum.
Скажем так я ее часто употребляю (иначе б не разводил этот базар), но не так чтоб зацикленно непрерывно, чтоб это могло реально как то влиять.
Ладно убедил. Возьму твой первый вариант, в самый раз.
А свой вариант со Split оставлю про запас на случай делимитеров в несколько символов (не помню правда что я это где-то использую).
...
Рейтинг: 0 / 0
29.10.2014, 08:16
    #38790122
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
господа оптимизаторы, вы ещё не всё отжали. Где работа с unsafe указателями?
...
Рейтинг: 0 / 0
29.10.2014, 09:39
    #38790224
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Изопропилгоспода оптимизаторы, вы ещё не всё отжали. Где работа с unsafe указателями?

Точняк. Не успел сам предложить :-)
...
Рейтинг: 0 / 0
29.10.2014, 09:44
    #38790237
ЕвгенийВ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Число вхождений символа в строку
Дмитрий77Ну т.е. для вычисления напр. к-ва запятых

Код: c#
1.
2.
3.
4.
  static int GetCount(string str, char ch)
        {
            return str.Count(x => x == ch);
        }
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Число вхождений символа в строку / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]