в массиве нет одинаковых чисел

#c#

#c#

Вопрос:

Я создаю программу, которая принимает значения в массив, но если вы попытаетесь ввести одно и то же значение дважды, оно отклоняется, если значение уникально, продолжайте.

 using System;

public class Program
{
    public static void Main()
    {   

        char[] charray = new char[7];

        Console.WriteLine("Enter 7 unique alphabetic characters: ");

        for (int i = 0; i < charray.Length; i  )
        {
            charray[i] = Convert.ToChar(Console.ReadLine());

            for (int j = 0; j < charray.Length; j  )
            {
                if (charray[i] == charray[j])
                {
                    Console.WriteLine("Please enter a unique alphabetic character.");
                }
            }   
        }
        Console.WriteLine(charray);
    }
}
  

Может кто-нибудь сказать мне, что не так?

Комментарии:

1. Пожалуйста, объясните, в чем проблема — почему ваш код не работает? Сказав это, я вижу, что вы настраиваете charray[i] = Convert.ToChar... , прежде чем выполнять проверку дубликатов. Вероятно, вам следует проверить наличие дубликатов перед присвоением нового значения.

2. Например, если я ввожу «r», он говорит о его дубликате. Затем, если я введу «g», он скажет дублировать. Все, что я ввожу, «дублируется».

3. Кстати, я попробую переместить проверку дубликатов и посмотреть, работает ли она

Ответ №1:

вы сравниваете каждый элемент в своем массиве с тем, что вы только что присвоили элементу в своем массиве, поэтому, конечно, вы всегда найдете дубликат… с элементом, который вы только что ввели.

Чего вы на самом деле хотите, так это:

 void Main()
{
    char[] charray = new char[7];

    Console.WriteLine("Enter 7 unique alphabetic characters: ");

    for (int i = 0; i < charray.Length; i  )
    {
        var x = Convert.ToChar(Console.ReadLine());
        if (charray.Contains(x))
        {
            Console.WriteLine("Please enter a unique alphabetic character.");
            i--;
        }
        else
        {
            charray[i] = x;
        }
    }
    Console.WriteLine(charray);
}
  

Комментарии:

1. Значит, это единственный способ сделать это? Я думал, что я на правильном пути с моим гнездом для циклов и оператором if

2. @Gravy_Train Оба по сути одинаковы, Contains просто более лаконичны. Вы можете if (charray.Contains(x)) заменить своим внутренним циклом и if — важными изменениями здесь является i-- и перемещение присваивания после проверки

3. Имеет смысл, однако я не пытался использовать Linq. Я стараюсь держаться подальше от этого, пока не получу больше понимания основ. Кстати, спасибо

Ответ №2:

Кстати, этот подход довольно медленный, особенно если вы расширяете свой массив, 7 — это нормально, но уровень оптимизации очень низкий, возможно, вы захотите взглянуть на концепцию хэш-карты. И, как говорили другие, поскольку вы сначала вставляете входные данные внутри своего массива, for всегда найдет ваш ввод внутри и вернет дублированный, возможно, вы захотите проверить дублирование перед операцией вставки.

Комментарии:

1. Я все еще новичок, пожалуйста, поймите.

2. Я понимаю, и именно поэтому я рекомендовал вам изучить такую концепцию, чтобы вы постепенно совершенствовались. @Phil ответ правильный и будет работать для вас сразу.

Ответ №3:

Я хотел бы предложить следующую реализацию:

 char[] charArray = new char[7];
Console.WriteLine("Enter {0} unique alphabetic characters: ", charArray.Length);

int i = 0;
while (i < charArray.Length)
{
    char inputChar = Console.ReadKey().KeyChar;
    Console.WriteLine();

    if (charArray.Contains(inputChar))
    {
        Console.WriteLine("Please enter a unique alphabetic character.");
    }
    else
    {
        charArray[i] = inputChar;
          i;
    }
}

Console.WriteLine(charArray);