Как бы вы посчитали вхождения строки (на самом деле символ) в строке?

При использовании Set-Content вместо Out-File вы можете указать кодировку Byte, которая может использоваться для записи массива байтов в файл. Это в сочетании с пользовательской кодировкой UTF8, которая не испускает спецификацию, дает желаемый результат:

# This variable can be reused
$utf8 = New-Object System.Text.UTF8Encoding $false

$MyFile = Get-Content $MyPath -Raw
Set-Content -Value $utf8.GetBytes($MyFile) -Encoding Byte -Path $MyPath

. Разница в использовании [IO.File]::WriteAllLines() или аналогичной заключается в том, что она должна работать нормально с любым типом элемента и путь, а не только фактические пути к файлам.

787
задан SteveC 24 April 2018 в 11:20
поделиться

6 ответов

При использовании.NET 3.5, можно сделать это в остроте с LINQ:

int count = source.Count(f => f == '/');

, Если Вы не хотите использовать LINQ, можно сделать это с:

int count = source.Split('/').Length - 1;
<час>

Вы могли бы быть удивлены узнать, что Ваша исходная техника, кажется, приблизительно на 30% быстрее, чем любой из них! Я только что сделал быстрый сравнительный тест с "/once/upon/a/time /" и результаты следующие:

Ваш оригинал = 12
источник. Количество = 19
источник. Разделение = 17
foreach ( из ответа bobwienholt ) = 10-е

(Времена для 50 000 000 повторений, таким образом, Вы вряд ли заметите много различия в реальном мире.)

935
ответ дан Community 24 April 2018 в 21:20
поделиться

Редактирование:

source.Split('/').Length-1
19
ответ дан Cody Guldner 24 April 2018 в 21:20
поделиться
  • 1
    если you' ре, передающее его. obj.field. ToString () работает над исходным экземпляром. obj.property. ToString () работает над копией если it' s тип значения. – Erik Funkenbusch 16 February 2010 в 01:43

Если Вы хотите смочь искать целые строки и не просто символы:

src.Select((c, i) => src.Substring(i))
    .Count(sub => sub.StartsWith(target))

Read как "для каждого символа в строке, возьмите остальную часть строки, начинающей с того символа как подстрока; считайте его, если это запускается с целевой строки".

84
ответ дан idbrii 24 April 2018 в 21:20
поделиться
  • 1
    Добавление дополнительной регистрации listIsAtTop() для listView.getFirstVisiblePosition() > 0 (и так же для конца в listIsAtBottom()) разрешает проблему " случайные эффекты " сверхпрокрутки; (Это происходит из-за Android' s переработка элементов списка, на которые вычисление выполняется). I' d все еще любят видеть, что эффект отображается, когда список брошен, но кроме которого, это выглядит хорошим! – Paul Lammertsma 28 February 2012 в 05:32

Они оба только работа для односимвольных критериев поиска...

countOccurences("the", "the answer is the answer");

int countOccurences(string needle, string haystack)
{
    return (haystack.Length - haystack.Replace(needle,"").Length) / needle.Length;
}

может оказаться лучше для более длинных игл...

, Но должен быть более изящный путь. :)

45
ответ дан ZombieSheep 24 April 2018 в 21:20
поделиться

LINQ работает над всеми наборами, и так как строки являются просто набором символов, как насчет этой миленькой остроты:

var count = source.Count(c => c == '/');

Удостоверяются, что Вы имеете using System.Linq; наверху Вашего файла кода, поскольку .Count дополнительный метод от того пространства имен.

53
ответ дан Chad 24 April 2018 в 21:20
поделиться
string source = "/once/upon/a/time/";
int count = 0;
foreach (char c in source) 
  if (c == '/') count++;

должно быть быстрее, чем source.Replace() отдельно.

169
ответ дан BartoszKP 24 April 2018 в 21:20
поделиться
  • 1
    Я haven' t реализованный бросок и при прокрутке в вышеупомянутом примере. Я didn' t испытывают " случайная сверхпрокрутка effects" но если you' ve зафиксировал его большой. – Graeme 28 February 2012 в 20:07
Другие вопросы по тегам:

Похожие вопросы: