我一直在寻找一种方法来检查数组元素的字符串,如果它包含其中一个元素来返回indexOf它但我找不到方法来执行此操作。我的大多数搜索最终都向我展示了如何找到indexOf数组中的元素或类似的东西。
作为一个背景,我正在尝试创建一个从用户输入中获取字符串的程序,将段落的单词拆分为数组,对它们执行某些检查并相应地更改它们。
例如,如果当前单词以辅音开头,它会找到第一个元音并将其前面的所有字母移动到单词的末尾。这就是我尝试的但它打印的索引为14,所以显然有些错误:
char[] vowelsList = new char[] { 'A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u' };
foreach (char vowel in vowelsList)
{
if (currentWord.Contains(vowel))
{
int index = currentWord.IndexOf(vowel);
System.Diagnostics.Debug.Write(index);
}
}
currentWord是来自当前正在检查的用户输入的字符串中的单词。
对于尝试不同方法或关键字的任何建议表示赞赏。
修改
我道歉代码实际上很好,它返回1和4因为它总是收到输入Hello而我误解了发生的事情,我有时候有点像个白痴。我想那时我的问题是如何让这段代码只找到第一个元音的索引,但是海报已经说明了如何做到这一点,谢谢大家的帮助和建议,其中大部分是我实施的。
答案 0 :(得分:3)
您可能希望使用String.IndexOfAny
,它返回指定Unicode字符数组中此任何字符的第一个匹配项的从零开始的索引。
如果未找到任何字符,则返回-1
。
var index = currentWord.IndexOfAny(vowelsList);
if (index >= 0)
{
// do stuff
}
请注意,如MSDN所述,此方法执行序数(区域性不敏感)搜索,其中只有在Unicode标量值相同时才将字符视为与其他字符等效。要执行区分文化搜索,您需要使用CompareInfo.IndexOf
方法的重载,其中Unicode标量值表示预组合字符。
答案 1 :(得分:2)
IndexOf
返回-1,所以只需使用
如果找到该字符,则从零开始的索引值位置,如果不是,则返回-1。
int index = currentWord.IndexOf(vowel);
if (index != -1)
{
System.Diagnostics.Debug.Write(index);
}
强制性的linq回答:
vowelsList.Select(v => currentWord.IndexOf(v))
.Where(idx => idx != -1)
.ToList();
您还可以使用ToLower
char[] vowelsList = new char[] { 'a', 'e', 'i', 'o', 'u' };
int index = currentWord.ToLower().IndexOf(vowel);
if (index != -1)
{
System.Diagnostics.Debug.Write(index);
}
vowelsList.Select(v => currentWord.ToLower().IndexOf(v))
.Where(idx => idx != -1)
.ToList();
如果您只想要第一个索引,可以将当前代码转换为扩展方法,如此
private int FirstIndexOfVowel(this string s)
{
char[] vowelsList = new char[] { 'a', 'e', 'i', 'o', 'u' };
foreach(char v in vowelsList)
{
int idx = s.ToLower().IndexOf(v);
if(idx != -1)
return idx;
}
return -1;
}
int idx = currentWord.FirstIndexOfVowel();
只有第一个索引的Linq版本(如果没有找到则返回null)
vowelsList.Select(v => currentWord.ToLower().IndexOf(v))
.FirstOrDefault(idx => idx != -1);
答案 2 :(得分:1)
这是你在找什么?
char[] vowelsList = new char[] {'A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u'};
foreach (char vowel in vowelsList)
{
if (currentWord.Contains(vowel))
{
int index = currentWord.IndexOf(vowel);
Console.WriteLine(currentWord.Substring(index, currentWord.Length - index) +
currentWord.Substring(0, index));
}
}
答案 3 :(得分:1)
这是我尝试过的,但它打印的索引是14,所以很明显 是错的
你不明白为什么它返回14,即使数组不包含这么多字符?这意味着您希望它返回char[]
中的char的索引,但是......
int index = currentWord.IndexOf(vowel);
返回单词中char的索引。
这应该按预期工作,我使用Array.IndexOf
来查找数组中char的索引:
foreach (char vowel in vowelsList)
{
if (currentWord.Contains(vowel))
{
int index = Array.IndexOf(vowelsList, vowel);
//...
}
}
另一种方法是不使用foreach
,而是使用已经知道索引的for循环。
答案 4 :(得分:1)
一个示例,它将为您提供所有元音(或您在数组中的任何条件)的良好且易于管理的概述:
var word = "Stupendous!";
char[] vowelsList =
new char[] { 'A', 'a', 'E', 'e', 'I', 'i', 'O', 'o', 'U', 'u' };
// Get all matches in a word, along with their positions:
var allVowels = word.Select((chr, pos) => new {chr, pos})
.Where(match => vowelsList.Contains(match.chr));
var positionOfFirst = allVowels.First().pos;
更新: Tim Schmelter可能是对的,所以我会更新我的答案,包括数组中字符的位置:
var allVowels = word
.Where(match => vowelsList.Contains(match))
.Select((chr, pos) =>
new {chr, pos, PosInArray =
Array.IndexOf(vowelsList, chr)});
var positionOfFirst = allVowels.First().PosInArray;
最后一段代码将返回(对于allVowels
)包含以下数据的IEnumerable:
{ {chr = u, pos = 2, PosInArray = 9},
{chr = e, pos = 4, PosInArray = 3},
{chr = o, pos = 7, PosInArray = 7},
{chr = u, pos = 8, PosInArray = 9} }