Если использование LINQ приемлемо, вы можете вызвать методы First () и Last () с соответствующим предикатом.
Например, еслиВы хотите, чтобы первый и последний символы не были гласными:
string vowels = "aeiouy";
char first = yourString.First(ch => vowels.IndexOf(ch) < 0);
char last = yourString.Last(ch => vowels.IndexOf(ch) < 0);
РЕДАКТИРОВАТЬ: Выше будут возвращаться символы, а не их индексы.Чтобы сделать это, вы можете проецировать индексы, используя метод Select () , но все станет слишком сложно, поскольку нам нужно вернуть -1
, если ни один символ не соответствует:
int firstIndex = (yourString.Select(
(ch, i) => new { Character = ch, Index = i }
).First(obj => vowels.IndexOf(obj.Character) < 0)
?? new { Character = '\0', Index = -1 }).Index;
int lastIndex = (yourString.Select(
(ch, i) => new { Character = ch, Index = i }
).Last(obj => vowels.IndexOf(obj.Character) < 0)
?? new { Character = '\0', Index = -1 }).Index;
Альтернативно, вот менее сложное решение, основанное на ответе @ abatishchev:
string vowels = "aeiouy";
int firstIndex = yourString.IndexOf(yourString.First(
ch => vowels.IndexOf(ch) < 0));
int lastIndex = yourString.LastIndexOf(yourString.Last(
ch => vowels.IndexOf(ch) < 0));