Найдите Энное возникновение символа в строке

Я нуждаюсь в помощи с созданием метода C#, который возвращает индекс Энного возникновения символа в строке.

Например, 3-е возникновение символа 't' в строке "dtststxtu" 5.
(Обратите внимание, что строка имеет 4 ts.)

76
задан ANeves 28 November 2013 в 21:10
поделиться

7 ответов

public int GetNthIndex(string s, char t, int n)
{
    int count = 0;
    for (int i = 0; i < s.Length; i++)
    {
        if (s[i] == t)
        {
            count++;
            if (count == n)
            {
                return i;
            }
        }
    }
    return -1;
}

Это можно было бы сделать намного чище, и здесь нет никаких проверок ввода.

81
ответ дан 24 November 2019 в 11:15
поделиться

Еще одно решение на основе RegEx (не проверено):

int NthIndexOf(string s, char t, int n) {
   if(n < 0) { throw new ArgumentException(); }
   if(n==1) { return s.IndexOf(t); }
   if(t=="") { return 0; }
   string et = RegEx.Escape(t);
   string pat = "(?<="
      + Microsoft.VisualBasic.StrDup(n-1, et + @"[.\n]*") + ")"
      + et;
   Match m = RegEx.Match(s, pat);
   return m.Success ? m.Index : -1;
}

Это должно быть немного более оптимальным, чем требование RegEx создать коллекцию Matches, чтобы отбросить все совпадения, кроме одного.

1
ответ дан 24 November 2019 в 11:15
поделиться

Джоэл ответил хорошо (и я его поддержал). Вот решение на основе LINQ:

yourString.Where(c => c == 't').Count();
4
ответ дан 24 November 2019 в 11:15
поделиться

Вот еще одно решение LINQ:

string input = "dtststx";
char searchChar = 't';
int occurrencePosition = 3; // third occurrence of the char
var result = input.Select((c, i) => new { Char = c, Index = i })
                  .Where(item => item.Char == searchChar)
                  .Skip(occurrencePosition - 1)
                  .FirstOrDefault();

if (result != null)
{
    Console.WriteLine("Position {0} of '{1}' occurs at index: {2}",
                        occurrencePosition, searchChar, result.Index);
}
else
{
    Console.WriteLine("Position {0} of '{1}' not found!",
                        occurrencePosition, searchChar);
}

Ради удовольствия, вот решение Regex. Я видел, как некоторые люди изначально использовали Regex для подсчета, но когда вопрос изменился, никаких обновлений не было. Вот как это можно сделать с помощью Regex - опять же, просто для удовольствия. Традиционный подход лучше всего подходит для простоты.

string input = "dtststx";
char searchChar = 't';
int occurrencePosition = 3; // third occurrence of the char

Match match = Regex.Matches(input, Regex.Escape(searchChar.ToString()))
                   .Cast<Match>()
                   .Skip(occurrencePosition - 1)
                   .FirstOrDefault();

if (match != null)
    Console.WriteLine("Index: " + match.Index);
else
    Console.WriteLine("Match not found!");
9
ответ дан 24 November 2019 в 11:15
поделиться

Обновление: Индекс N-го однострочного сообщения:

int NthOccurence(string s, char t, int n)
{
    s.TakeWhile(c => n - (c == t)?1:0 > 0).Count();
}

Используйте их на свой страх и риск. Это похоже на домашнее задание, поэтому я оставил там несколько ошибок, которые вы можете найти:

int CountChars(string s, char t)
{
   int count = 0;
   foreach (char c in s)
      if (s.Equals(t)) count ++;
   return count;
}

.

int CountChars(string s, char t)
{
     return s.Length - s.Replace(t.ToString(), "").Length;
}

.

int CountChars(string s, char t)
{
    Regex r = new Regex("[\\" + t + "]");
    return r.Match(s).Count;
}
10
ответ дан 24 November 2019 в 11:15
поделиться

Вот забавный способ сделать это

     int i = 0;
     string s="asdasdasd";
     int n = 3;
     s.Where(b => (b == 'd') && (i++ == n));
     return i;
3
ответ дан 24 November 2019 в 11:15
поделиться
    public static int FindOccuranceOf(this string str,char @char, int occurance)
    {
       var result = str.Select((x, y) => new { Letter = x, Index = y })
            .Where(letter => letter.Letter == @char).ToList();
       if (occurence > result.Count || occurance <= 0)
       {
           throw new IndexOutOfRangeException("occurance");
       }
       return result[occurance-1].Index ;
    }
1
ответ дан 24 November 2019 в 11:15
поделиться
Другие вопросы по тегам:

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