2017-01-08 2 views
1

У меня проблема с тем, что мне нужно найти последнее слово в массиве, которое находится в верхнем регистре.Найти последнее слово в верхнем регистре из массива

Я уже разделить все строки на слова:

string[] words = Regex.Split(e, sk);

пытался что-то вроде этого

z = words.Where(c => c == c.ToUpper().Last());

но это Безразлично `помощь в любом случае ..

Может кто-то есть предложения?

+0

Что такое 'e' и' sk'? Здесь, вероятно, не должно быть необходимости в regex ... Если вы все равно раскалываетесь на пробелы. В любом случае, регулярное выражение несущественно для вопроса, если желание найти слово в уже разделенной строке (что и есть «слова»). Нижеприведенные решения будут работать для любого 'IEnumerable '. – pinkfloydx33

+0

@ pinkfloydx33 В соответствии с задачей я должен использовать регулярное выражение .. 'e' - одна строка. В основной функции я читаю все строки и просто использую foreach для каждого. Это потому, что есть еще несколько задач, которые мне нужно сделать, поэтому мне нужно взять каждую строку. 'sk' - разделитель, строка sk = "[\\ s,.;:/?!() \\ -] +"; – Martin

ответ

3

Используйте этот LINQ-запроса:

z = words.Where(c =>c.All(Char.IsUpper)).Last(); 

или как это было предложено в другой ответьте LastOrDefault, чтобы получить строку null, если в верхнем регистре ничего не сделано.

+0

'bool' не содержит определения для 'Last' и no метод расширения «Last», принимающий первый аргумент типа «bool», может быть найден (вам не хватает директивы использования или ссылки на сборку? Это то, что я получаю – Martin

+0

@Martin, если вы используете VS, там должно быть быть «предлагаемыми исправлениями» (IIRC это Ctrl +.), чтобы автоматически добавить директиву использования – Moira

+1

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

3

Ваш призыв к Last() должен быть вне лямбда (см Maksim Simkin's answer.)

words.LastOrDefault(c => c == c.ToUpper()) подходят ли ваши потребности? Так как вам нужен последний матч.

Есть, вероятно, более эффективные способы обнаружения, является ли строка в верхнем регистре, например c.All(Char.IsUpper), так что вы можете использовать

words.LastOrDefault(c => c.All(Char.IsUpper)) 
+0

Это отличная идея, чтобы расширить свой ответ на копирование ниже: –

+0

@MaksimSimkin wellll Я кое-что узнал + поддержал ваш :) – Moira

+0

Вы не совсем скопировали его правильно. Другой ответ передает «Char.IsUpper» как группу методов. Ваш пример не делает этого и генерирует ошибку компилятора. Либо удалите дополнительные круглые скобки, либо измените их на нечто вроде 'words.LastOrDefault (c => c.All (ch => char.IsUpper (ch)))' – pinkfloydx33

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