Удалить текст из массива строк и проверить, содержит ли указанная строка c в массиве строк? - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь получить данные из MySQL в Unity. Данные в формате ID:AZ22; ID:TR56;.... Я могу получить данные. Но я хочу удалить текст ID: из массива строк данных и, наконец, хочу проверить, содержится ли конкретная строка из Unity в массиве строк данных. Я пытаюсь использовать функцию Contains(), но она не работает. Для меня не имеет значения, найдена ли строка на 5-й позиции или нет вообще. Я просто хочу, чтобы код проверял, есть ли совпадение или нет.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

public class ReceiveData : MonoBehaviour
{
    public string checkForString = "AZ22";
    public string[] Items;
    IEnumerator Start()
    {
        WWW data = new WWW("http://localhost/GetID.php");
        yield return data;
        string dataString = data.text;

        Items = dataString.Split(';');

        if(checkForString.Contains(dataString))
        {
            Debug.Log("String Contains");
        }
        else
        {
            Debug.Log("String does not contain");
        }
    }


}

1 Ответ

2 голосов
/ 06 марта 2020

Items - это массив строк вида

{
    "ID:AZ22",
    "ID:TR56",
    ...
}

Метод

Items.Contains(checkForString)

проверяет, содержит ли массив Items строку checkForString, то есть каждый элемент сравнивается, равен ли он checkForString. Поскольку все строки в элементах содержат часть "ID:", ни одна из строк не равна "AZ22". Вы можете решить эту проблему, сравнив записи с "ID:AZ22" - если вы хотите сохранить идентификатор, как в вашем коде, это будет возможно с

Items.Contains($"ID:{checkForString}")

Вы можете - однако - удалить "ID:" сразу с

Items = dataString.Split(';')
                  .Select(s => s.Substring(3))
                  .ToArray();

Конечно, в этом случае вам не нужно добавлять "ID:" к Contains.

Редактировать: Для обработки недопустимого ввода

Если вы получили ошибку

startIndex не может быть больше длины строки.

это означает, что любая из строк в массиве не иметь форму "ID:XXXXX". В этом случае вы можете отфильтровать элементы перед удалением префикса

Items = dataString.Split(';')
                  .Where(IsValidId)
                  .Select(s => s.Substring(3))
                  .ToArray();

с помощью

private bool IsValidId(string s)
{
    return s.StartsWith("ID:") && s.Length > 3;
}

Возможно, проблема в том, что исходная строка заканчивается на ;. В этом случае Split возвращает пустую строку как последний элемент. Это может быть смягчено с помощью StringSplitOptions

Items = dataString.Split(new[]{';'}, StringSplitOptions.RemoveEmptyEntries)
                  .Select(s => s.Substring(3))
                  .ToArray();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...