2017-02-15 19 views
0

Я занимаюсь разработкой Xamarin.Forms приложения на UWPЕсть ли простой способ применить грамматический корпус к строке?

У меня есть Editor контроль - в основном многострочный TextBox

Я пытаюсь применить некоторые простые грамматические оболочки к строке в основном следующие:

  • Заглавие слова "I"
  • Прочитать первые слова
  • Capitali se Первое слово после полной остановки.

Мне удалось сделать первые два, и я немного застрял на третьем, и мне было интересно, есть ли более простой способ или можно ли адаптировать мой алгоритм.

То, что я до сих пор:

public static string ToGramaticalCase(this string s) 
    { 
     var thingsToCapitalise = new String[] {"i"}; 

     string newString = string.Empty; 
     if (!string.IsNullOrEmpty(s)) 
     { 
      var wordSplit = s.Split(' '); 
      if (wordSplit.Count() > 1) 
      { 
       var wordToCapitalise = wordSplit.First(); 
       wordToCapitalise = wordToCapitalise.Substring(0, 1).ToUpper() + wordToCapitalise.Substring(1); 
       var value = wordToCapitalise + s.Substring(wordToCapitalise.Length); 
       foreach (var item in thingsToCapitalise) 
       { 
        value = value.Replace(string.Format(" {0} ", item), string.Format(" {0} ", item.ToUpper())); 
       } 
       newString = value; 
      } 

     } 
     return newString; 
    } 
+1

Не уверен, что если он делает все, что вы хотите, но вы посмотрите на [Humanizer] (https://github.com/Humanizr/Humanizer) –

ответ

1

Этот метод будет использовать все слова после слова «. «:

 [Test] 
     public void Test() 
     { 
      var result = NewSentenceWithUpperLetter("Sentence one. sentence two."); 
      // result will be 'Sentence one. Sentence two.' 
     } 

     private string NewSentenceWithUpperLetter(string text) 
     { 
      var splitted = text.Split(' '); 
      for (var i = 1; i < splitted.Length; i++) 
      { 
       if (splitted[i - 1].EndsWith(".")) 
       { 
        splitted[i] = splitted[i][0].ToString().ToUpper() + splitted[i].Substring(1); 
       } 
      } 

      return string.Join(" ", splitted); 
     } 
1

Просто разделить строку и на полной остановки. Измените эту строку:

var wordSplit = s.Split(' '); 

В это:

var wordSplit = s.Split(new char[] { ' ', '.' },StringSplitOptions.RemoveEmptyEntries); 

Редактировать

Этот метод расширения будет делать то, что вы хотите:

public static string ToTitleCase(this string input) 
{ 
    string output = 
     String.Join(" ", input.Split(new char[] { ' ' },StringSplitOptions.RemoveEmptyEntries) 
        .ToList() 
        .Select(x => x = x.Length>1? 
           x.First().ToString().ToUpper() + x.Substring(1): 
           x.First().ToString().ToUpper())); 
    output = 
     String.Join(".", output.Split(new char[] { '.' },StringSplitOptions.RemoveEmptyEntries) 
         .ToList() 
         .Select(x => x = x.Length > 1 ? 
           x.First().ToString().ToUpper() + x.Substring(1) : 
           x.First().ToString().ToUpper())); 
    return output; 
} 

Тест строка: string input = "i try this test sentence .now it works as i want";

Выход: I Try This Test Sentence .Now It Works As I Want

+0

' wordsplit' в настоящее время используется только, чтобы получить Первое слово строки, мне нужно другое 'ForEach'? Могли бы вы сделать« dotnetfiddle »? – user1

+0

Нет, просто измените строку, которую я вам сказал. Она должна работать нормально (хотя я ее не тестировал) – Pikoh

+0

Подождите, теперь я вижу проблему. Он не присоединится к предложению, как должен. Позвольте мне задуматься об этом – Pikoh

 Смежные вопросы

  • Нет связанных вопросов^_^