【问题标题】:Finding array element within a string C#在字符串 C# 中查找数组元素
【发布时间】:2014-07-30 06:38:28
【问题描述】:

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

【问题讨论】:

  • 总而言之-您只需要从输入字符串中的给定字符串数组(在本例中为vowelsList)中获取元素的第一次出现(索引)吗?还是数组中每个字符串的每个第一个索引?
  • 这个例子中currentWord的值是多少?
  • @pwas 我只需要从输入字符串中的给定数组中获取第一次出现的元素。
  • 打印出 14 的索引,很明显有些地方出了问题 - 在这种情况下,currentWord 的值是多少,对于哪个vowel 打印出 14?我看不出这段代码有什么问题。
  • @fost "第一次出现给定数组中的元素" 你的意思是任何元素吗?

标签: c# arrays string indexof


【解决方案1】:

您可能希望使用String.IndexOfAny,它返回指定Unicode 字符数组中任何字符在此实例中第一次出现的从零开始的索引。

如果没有找到字符,则返回-1

var index = currentWord.IndexOfAny(vowelsList);
if (index >= 0)
{ 
    // do stuff
}

请注意,如 MSDN 中所述,此方法执行 ordinal(文化不敏感)搜索,其中一个字符仅当其 Unicode 标量值相同时才被视为等同于另一个字符。要执行 文化敏感 搜索,您需要使用 CompareInfo.IndexOf 方法的重载,其中 Unicode 标量值表示预组合字符。

【讨论】:

  • 很好,从来不知道这个
  • 神圣的@%$#,如此简单。也不知道这个。
【解决方案2】:

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);

【讨论】:

  • 感谢所有效率提示并在我意识到那是什么之前回答了我的真正问题:P。
  • @fost:为了完整起见,你真正的问题是什么?
  • @fost - 不用担心,我不确定这其中的哪一部分是真正解决问题的部分,但这里的 FirstIndexOfVowel 方法基本上就是 Groo 的答案正在做的事情
  • 我想我已经明白了,使用Console.WriteLine 而不是Console.Write ;-) (不是索引14,而是1 + 4)您还应该熟悉调试器。
【解决方案3】:

这是你要找的吗?

   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));
            }
        }

【讨论】:

  • 这确实是我一直在寻找的,我的代码正在查找单词中每个元音的每个实例,但是一旦我将其更改为仅查找第一个元音,此代码将执行我希望程序执行的操作做。泰
  • 祝你快乐 :)
【解决方案4】:

这是我尝试过的,但它打印出 14 的索引,所以很清楚 错了

你不明白为什么即使数组不包含这么多字符,它也会返回 14?这意味着您希望它返回 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循环。

【讨论】:

  • 你最好只使用for循环而不是foreach,然后你的索引就在那里+1,如果这是op想要的。
  • @Sayse:他没有迭代 currentWord 元素。
  • @Groo - 我从没说过他是
  • @Sayse:但我怀疑 OP 是否需要 vowelList 中的 vowel 的索引。
  • @Groo - 鉴于 Tim 的引述很合理,这实际上是 OP 想要的
【解决方案5】:

一个示例,它将为您提供所有元音(或您在数组中的任何标准)的良好且易于管理的概览:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多