需要从C#程序中删除重复的值

时间:2016-03-25 02:40:10

标签: c#

我需要一些我正在创建的C#程序的帮助。因此,在这种情况下,我正在向程序中输入重复值。例如,a,b,b,c,c。
练习是,如果输入任何重复的字母(没有数字),我应该收到一个错误,说明“重复值。请再试一次!”并且不接受重复值,并应将值显示为a,b,c,d,e。

class Program
{
    static void Main(string[] args)
    {
    char[] arr = new char[5];

    //User input
    Console.WriteLine("Please Enter 5 Letters only: ");

    for (int i = 0; i < arr.Length; i++)
    {
        arr[i] = Convert.ToChar(Console.ReadLine());
    }
    //display
    for(int i = 0; i<arr.Length; i++)
    {
        Console.WriteLine("You have entered the following inputs: ");
        Console.WriteLine(arrArray[i]);
    }
 }
}

5 个答案:

答案 0 :(得分:1)

在开始时选择正确的数据结构,使用HashSet而不是数组,因为操作主要是查找&amp;插入

答案 1 :(得分:0)

使用Any linq表达式来验证重复项。 char.TryParse将验证输入并在成功时返回true

public static void Main()
{
    char[] arr = new char[5];

    //User input
    Console.WriteLine("Please Enter 5 Letters only: ");

    for (int i = 0; i < arr.Length; i++)
    {
         char input;

        if(char.TryParse(Console.ReadLine(), out input) && !arr.Any(c=>c == input))
        {           

            arr[i] = input;
        }
        else
        {
            Console.WriteLine( "Error : Either invalid input or a duplicate entry.");
            i--;
        }
    }

    Console.WriteLine("You have entered the following inputs: ");
    //display
    for(int i = 0; i<arr.Length; i++)
    {

        Console.WriteLine(arr[i]);
    }

}

工作Code

答案 2 :(得分:0)

使用哈希表(通用词典)是确定是否已经遇到输入字符的有效方法。

此外,.NET框架中的Char.IsLetter方法是检查错误数据的好方法。

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="scan"
    android:id="@+id/buttonScan"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true" />

<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/list"
    android:layout_centerHorizontal="true"
    android:layout_below="@+id/buttonScan" />

答案 3 :(得分:0)

阐述Shelvin使用HashSet的答案

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

//User input
Console.WriteLine("Please Enter 5 Letters only: ");
for (int i = 0; i < 5; )
{
     char c = Convert.ToChar(Console.ReadLine());
     if(!("abcdefghijklmnopqrstuvwxyz".Contains(c.ToString().ToLower())))
     {
          Console.WriteLine("Please enter an alphabet");
          continue;
     }
     else if (!chars.Contains(c))
     {
          chars.Add(c);
          i++;
     }
     else
     {
          Console.WriteLine("Duplicate value please try again");
          continue;
     }
}
//display
Console.WriteLine("You have entered the following inputs: ");
foreach(char c in chars)
    Console.WriteLine(c.ToString());

Console.Read();

答案 4 :(得分:0)

保持简单,尽管HashSet在语义上很好,但5个元素不需要它(在这种情况下它实际上比List慢)。更糟糕的是,它需要一个并行结构来跟踪字符(假设您关心订单)。

  

显然,这些考虑事项对于这样一个小例子都不重要,但是如果实际测量的性能和内存消耗应该是大多数实际应用的指南,那么最好先学习它们并且不要总是跳到big-O表示法。 / p>

相反,您可以这样做: -

List<char> chars = new List<char>(5);
while (chars.Count < 5)
{
   char c = Console.ReadKey().KeyChar;
   if (!char.IsLetter(c)) continue;
   if (chars.Contains(char)) continue;
   chars.Add(char);
}

加上您要添加的任何错误消息。