C# 在字符串C中查找数组元素#
我一直在寻找一种方法来检查字符串中的数组元素,以及它是否包含这些元素中的一个元素,以返回它的索引,但我很难找到一种方法来执行此操作。我的大多数搜索结果都向我展示了如何在数组或类似对象中查找元素的索引 作为一个背景,我试图创建一个程序,从用户输入中提取一个字符串,将段落中的单词拆分成一个数组,对它们执行某些检查,并相应地更改它们 例如,如果当前单词以辅音开头,它会找到第一个元音,并将其前面的所有字母移动到单词的末尾。这是我尝试过的,但它打印了一个14的索引,所以很明显有些地方出了问题:C# 在字符串C中查找数组元素#,c#,arrays,string,indexof,C#,Arrays,String,Indexof,我一直在寻找一种方法来检查字符串中的数组元素,以及它是否包含这些元素中的一个元素,以返回它的索引,但我很难找到一种方法来执行此操作。我的大多数搜索结果都向我展示了如何在数组或类似对象中查找元素的索引 作为一个背景,我试图创建一个程序,从用户输入中提取一个字符串,将段落中的单词拆分成一个数组,对它们执行某些检查,并相应地更改它们 例如,如果当前单词以辅音开头,它会找到第一个元音,并将其前面的所有字母移动到单词的末尾。这是我尝试过的,但它打印了一个14的索引,所以很明显有些地方出了问题: char[
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,我误解了发生的事情,有时我有点傻。我想我的问题是如何让这段代码只找到第一个元音的索引,但海报上已经说明了如何做到这一点,谢谢大家的帮助和建议,我已经实现了其中的大部分。如果字符串不包含元音,则返回-1,所以使用它
如果找到该字符,则值的从零开始的索引位置;如果未找到,则为-1
linq必须回答:
vowelsList.Select(v => currentWord.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)
这就是你要找的吗
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[]
中字符的索引,但是
int index = currentWord.IndexOf(vowel);
返回单词中字符的索引
这应该可以正常工作,我使用它来查找数组中字符的索引:
foreach (char vowel in vowelsList)
{
if (currentWord.Contains(vowel))
{
int index = Array.IndexOf(vowelsList, vowel);
//...
}
}
var allVowels = word
.Where(match => vowelsList.Contains(match))
.Select((chr, pos) =>
new {chr, pos, PosInArray =
Array.IndexOf(vowelsList, chr)});
var positionOfFirst = allVowels.First().PosInArray;
另一种方法不是使用foreach,而是使用一个已经知道索引的for循环。一个示例,它将为您提供所有元音(或您在数组中的任何标准)的良好且易于管理的概述: 更新:Tim Schmelter可能是对的,因此我将更新我的答案,以包括字符在数组中的位置:
foreach (char vowel in vowelsList)
{
if (currentWord.Contains(vowel))
{
int index = Array.IndexOf(vowelsList, vowel);
//...
}
}
var allVowels = word
.Where(match => vowelsList.Contains(match))
.Select((chr, pos) =>
new {chr, pos, PosInArray =
Array.IndexOf(vowelsList, chr)});
var positionOfFirst = allVowels.First().PosInArray;
最后一段代码将返回(对于所有元音
)一个包含以下数据的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} }
您可能希望使用,它返回指定Unicode字符数组中任何字符在此实例中第一次出现的从零开始的索引
如果未找到字符,则返回-1
var index = currentWord.IndexOfAny(vowelsList);
if (index >= 0)
{
// do stuff
}
请注意,如MSDN上所述,此方法执行顺序(不区分区域性)搜索,其中一个字符仅在其Unicode标量值相同时才被视为等同于另一个字符。要执行区域性敏感搜索,您需要使用重载
CompareInfo.IndexOf
方法,其中一个Unicode标量值表示预合成字符。总之,您只需要从输入字符串的给定字符串数组(在本例中为元音列表
)中获取元素的第一次出现(索引)?或者数组中每个字符串的第一个索引?在本例中,currentWord
的值是多少?@pwas我只需要从输入字符串的给定数组中获取元素的第一次出现。打印14的索引,显然有问题-在这种情况下,currentWord
的值是多少,它为哪个元音打印14?我看不出这段代码有任何错误。@fost“给定数组中元素的首次出现”是指任何元素吗?最好使用for循环而不是foreach,如果这是op想要的,那么你的索引就是+1。@Sayse:他没有迭代currentWord
元素。@Groo-我从来没有说过他was@Sayse:但我怀疑OP是否需要vowelList
@Groo中的元音的索引-鉴于Tim已经包含了这一引语,这很有可能就是OP的实际内容wantNice,从来都不知道这个神圣的%$#,这么简单。我也不知道这件事。谢谢你给我的效率提示,在我意识到这是什么之前回答了我真正的问题:P.@fost:为了完整起见,你真正的问题是什么?@fost-不用担心,我不确定这其中的哪一部分是真正解决问题的,但是这里的FirstIndexOfVowel
方法基本上就是Groo的答案所做的。我想我已经理解了,使用控制台。WriteLine
而不是控制台。Write
;-)(不是索引14,而是1+4)您还应该熟悉调试器。这确实是我正在寻找的,我的代码正在查找单词中每个元音的每个实例,但一旦我更改为仅查找第一个元音,这段代码将执行我希望程序执行的操作。我为你高兴,伙计:)
{ {chr = u, pos = 2, PosInArray = 9},
{chr = e, pos = 4, PosInArray = 3},
{chr = o, pos = 7, PosInArray = 7},
{chr = u, pos = 8, PosInArray = 9} }
var index = currentWord.IndexOfAny(vowelsList);
if (index >= 0)
{
// do stuff
}