所以任务是我必须编写一个程序让用户输入文本。之后,我必须仅过滤非大写字母的文本,并将它们放在列表中。每个字母只能在列表中一次。我的代码的问题是,当我输入“ 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]}");
}
}
我收到索引超出范围的错误消息。
答案 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)
以下几件事可以为您提供帮助:
简短示例:
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]}");
它将随您的需要而工作。