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