C # Сравнение ввода пользователя в массив строк

1

Я сравниваю пользовательский ввод в свой 2d-массив, который является кодами ниже

string[,] Arr = new string[,]{
{"A1" , " A2" , " A3" , " A4" , " A5"},
{"B1" , " B2" , " B3" , " B4" , " B5"}};

im, используя эти коды для сравнения

bool invalid = Enumerable.SequenceEqual(UserInput, Arr);

я хочу вывести недопустимый, если пользователь ввел строку, которая не находится в массиве

  • 0
    Каков тип UserInput ?
  • 0
    я хочу вывести неверный, если пользователь вводит целое число или строку, которой нет в моем 2d массиве
Показать ещё 2 комментария
Теги:
arrays

3 ответа

2

Хотя LINQ может сделать код "чистым", вы должны понимать, что он все равно должен проверять каждый элемент массива, чтобы определить, присутствует ли запрошенный элемент.

Как это делается внутри, может или не может быть более эффективным, чем вы можете скопировать вручную. На самом деле, я видел много случаев, когда программисты делают свои приложения намного более неэффективными, преобразовывая существующий код в LINQ просто потому, что он "чище".

Например, попросив LINQ собрать список элементов, отвечающих определенным критериям, тогда цикл через набор результатов намного более неэффективен, чем прямой цикл: если элемент, который вы ищете, находится в последней позиции списка, вы можете зацикливать через список, дважды используя LINQ, а затем повторяя элементы, а не один раз с прямым циклом.

Теперь, чтобы применить вышеуказанную информацию к вашей конкретной проблеме, реальный вопрос заключается в том, что вы пытаетесь сделать, когда матч сделан? Если вы пытаетесь найти позицию в массиве записи, то есть один подход. Если вы пытаетесь только подтвердить эту запись, тогда существует другой подход.

Если это было мое приложение, массивы были невелики, и мне просто было интересно проверить существование элемента в массиве, я бы загрузил этот массив в регистр/нечувствительный к культуре Hashset, а затем использовал метод Contains, чтобы определить, вход пользователя был действительным. Основная причина такого подхода заключается в том, что метод Contains имеет производительность O (1).

Если пользовательский ввод получен в цикле, добавьте следующее перед циклом:

    var cItems = new HashSet<string>(StringComparer.InvariantCultureIgnoreCase);
    foreach (var sValue in Arr)
    {
        cItems.Add(sValue);
    }

Затем в цикле добавьте это, чтобы проверить наличие пользовательского ввода:

    if (!cItems.Contains(UserInput))
    {
        System.Diagnostics.Debug.WriteLine("Invalid Entry");
    }

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

Если в будущем вы захотите найти координату X/Y для введенного элемента, тогда будут разные подходы, в зависимости от количества данных в массиве и количества ввода, которое вы ожидаете от пользователя.

1

Просто примите строку, используя String input = Console.ReadLine(); Затем используйте foreach в своем массиве и сравните его со входом.

Используйте это, его долгое время:

        bool c =false;
        string[,] Arr = new string[,]{
            {"A1" , "A2" , "A3" , "A4" , "A5"},
            {"B1" , "B2" , "B3" , "B4" , "B5"}};
        Console.Write("Input: ");
        string input = Console.ReadLine();
        foreach (String temp in Arr)
        {
            c = input.Equals(temp);
            if (c)
                break;
        }

        if (c)
            Console.Write("Your input is on the array.");
        else
            Console.Write("Your input is not on the array.");
        Console.ReadLine();
    }
0

я хочу вывести недопустимый, если пользователь ввел строку, которая не находится в массиве

Чтобы сравнить два массива таким образом, вы должны сгладить ваш 2D-массив "Arr" в 1D-массив с Enumerable.SelectMany. Затем используйте Enumerable.Any в UserInput с Enumerable.Contains в массиве flatten с запросом Linq.

UserInput тоже должен быть массивом!

Пример:

var flattenArr = Arr.SelectMany(x=>x).ToArray();
bool invalid = UserInput.Any(x => !flattenArr.Contains(x));

Если какой-либо элемент UserInput не содержится в "flattenArr", он возвращает true.

Не забудьте использовать System.Linq.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню