在字符串C#中查找数组元素

时间:2014-07-30 06:38:29

标签: c# arrays string indexof

我一直在寻找一种方法来检查数组元素的字符串,如果它包含其中一个元素来返回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而我误解了发生的事情,我有时候有点像个白痴。我想那时我的问题是如何让这段代码只找到第一个元音的索引,但是海报已经说明了如何做到这一点,谢谢大家的帮助和建议,其中大部分是我实施的。

5 个答案:

答案 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} }