从文本中选择字母并将其放入列表中

时间:2019-09-22 16:45:48

标签: c# string

所以任务是我必须编写一个程序让用户输入文本。之后,我必须仅过滤非大写字母的文本,并将它们放在列表中。每个字母只能在列表中一次。我的代码的问题是,当我输入“ even”之类的单词时,该方法会选择e和v,但该方法不会跳过第二个“ e”并在那里结束。

for (int i = 0; i < text.Length; i++)
{
    if (letters.Contains(text[i]) == false && (text[i] >= 'a' && text[i] <= 'z'))
    {
        letters.Add(text[i]);
        Console.WriteLine($"{letters[i]}");
    }
}

我收到索引超出范围的错误消息。

5 个答案:

答案 0 :(得分:4)

似乎异常是由以下行引起的:

Console.WriteLine($"{letters[i]}");

您可以用

替换吗
Console.WriteLine($"{text[i]}");

或者您可以使用foreach和另一个变量调用方letter

foreach (var letter in text)
{
    if (letters.Contains(letter) == false && (letter >= 'a' && letter <= 'z'))
    {
        letters.Add(letter);

        Console.WriteLine($"{letter}");
    }
}

答案 1 :(得分:1)

IndexOutOfRangeException的原因在于以下几行。

letters.Add(text[i]);
Console.WriteLine($"{letters[i]}");

i= 3时,您正在尝试处理'n'列表中不存在的字符letters(假设您的输入为“偶数”)。然后,将其添加到letters列表中并打印letters[3]。但是,此时,letters中只有2个项目(“ e”和“ v”)。这就是引发IndexOutOfRangeException的原因。

要打印添加到letters的最后一个元素,您可以做的是

Console.WriteLine($"{letters.Last()}");

Console.WriteLine($"{letters[letters.Count - 1]}");

同时,正如juharr指出的那样,即使打印text[i]也会产生相同的结果,因为它是相同的字符。

Console.WriteLine($"{text[i]}");

答案 2 :(得分:0)

Char类已经具有验证字符的扩展名,您可以使用char.IsLetter(character)char.IsLower(character)仅获取小写字母。

这是您的代码示例:

string input = "Even if I'm a string, I still like odd numbers like 1, 3, 5 ..etc.";

var text = input.ToCharArray();

List<char> letters = new List<char>();

for(int x =0; x < text.Length; x++)
{
    if (char.IsLetter(text[x]) && char.IsLower(text[x]) && !letters.Contains(text[x]))
    {
        letters.Add(text[x]);
        Console.WriteLine($"{text[x]}");
    }

}

答案 3 :(得分:0)

以下几件事可以为您提供帮助:

  1. HashSet
  2. Char.IsLetter

简短示例:

            HashSet<char> characters = new HashSet<char>();

            foreach (char c in text)
            {
                if (Char.IsLetter(c))
                {
                    // This will add the character ONLY if it is not there
                    characters.Add(c);
                }
            }

完整的控制台应用程序。如果您想尝试它,请创建一个新的控制台应用程序,并用以下内容替换所有Programs.cs:

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string text = "evEn There";

            // HashSet is like a list, but without duplicates
            HashSet<char> characters = new HashSet<char>();

            // First make all characters lower case
            text = text.ToLower();

            foreach (char c in text)
            {
                if (Char.IsLetter(c))
                {
                    // This will add the character ONLY if it is not there, if not it returns false
                    bool couldBeInserted = characters.Add(c);
                }
            }

            string allCharacters = new String(characters.ToArray());

            //This will print: "evnthr"
            Console.WriteLine(allCharacters);

        }
    }
}

答案 4 :(得分:0)

对于数组中的唯一项,您可以使用LINQ Where方法和ToHashSet方法轻松实现:

var text = "Avene";
var letters = text.Where(ch => char.IsLower(ch)).ToHashSet();
// leters contain now 'e', 'v' and 'n'

要摆脱该异常,您可以执行以下操作:

Console.WriteLine($"{text[i]}");

它将随您的需要而工作。