在字符串中查找数组元素
本文关键字:数组元素 查找 字符串 | 更新日期: 2023-09-27 18:15:39
我一直在寻找一种方法来检查数组元素的字符串,如果它包含其中一个元素来返回它的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,我误解了正在发生的事情,我有时有点白痴。我想我的问题是如何让这个代码只找到第一个元音的索引,但海报已经说明了如何做到这一点,感谢大家的帮助和建议,其中大部分我已经实现。
您可能想使用String.IndexOfAny
,它返回在此实例中指定的Unicode字符数组中任何字符的第一次出现的从零开始的索引。
如果没有找到字符,则返回-1
。
var index = currentWord.IndexOfAny(vowelsList);
if (index >= 0)
{
// do stuff
}
请注意,正如MSDN上所述,该方法执行顺序(文化不敏感)搜索,其中只有当一个字符的Unicode标量值相同时才认为它与另一个字符相等。要执行对文化敏感的搜索,您需要使用CompareInfo.IndexOf
方法的过载,其中Unicode标量值表示预组合字符。
如果字符串不包含元音,则IndexOf
返回-1,因此仅使用
如果找到该字符,则为value的从零开始的索引位置,否则为-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);
这是你要找的吗?
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));
}
}
这是我尝试过的,但它打印了一个14的索引,所以很明显的东西是错误的
你不明白为什么它返回14,即使数组不包含这么多字符?这意味着您期望它返回char[]
中char的索引,但是……
int index = currentWord.IndexOf(vowel);
返回字中该字符的索引。
这应该像预期的那样工作,我使用Array.IndexOf
来查找数组中字符的索引:
foreach (char vowel in vowelsList)
{
if (currentWord.Contains(vowel))
{
int index = Array.IndexOf(vowelsList, vowel);
//...
}
}
另一种方法是不使用foreach
,而是使用已经知道索引的for循环。
一个示例,它将给你一个很好的和可管理的概述所有元音(或无论你在数组中的标准是什么):
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} }