在字符串中查找数组元素

本文关键字:数组元素 查找 字符串 | 更新日期: 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} }