Инициализация коллекций в приложениях Windows Form - PullRequest
1 голос
/ 15 мая 2011

Я пишу приложение, которое проверит текст, введенный в поле расширенного текста, и выяснит, содержит ли оно кандзи (китайские иероглифы) за пределами определенного списка.

В настоящее время я использую строковый массив для 1000 кандзи, которые я хочу разрешить, и я просто делаю цикл for для каждого элемента в пользовательском вводе и проверяю, есть ли кандзи в списке или нет. Если это не так, я возвращаю список в конце всех «не разрешенных» кандзи.

Мои вопросы: прямо сейчас я создаю строковый массив внутри метода check, который запускается, когда пользователь нажимает кнопку «check», но я боюсь, что это означает, что я создаю список 1000 кандзи каждый раз, когда выполняется операция сделанный. Где и как загрузить массив строк 1000 кандзи, чтобы он всегда загружался в память? Есть какой-то способ просто инициализировать готовый список (мне не нужно добавлять или удалять элементы - я использую его почти как словарь).

Ответы [ 4 ]

1 голос
/ 15 мая 2011

Вам лучше хранить символы в коллекции List и использовать List.Contains, чтобы увидеть, есть ли символ в списке:

var myCharacters = new List<string>();
// Fill in the list...

if (myCharacters.Contains('?'))
{
  // Do something
}

Создать и заполнить список «myCharacters» только один раз. Вызывайте метод myCharacters.Contains () всякий раз, когда вам нужно проверить наличие символа. Метод Contains () оптимизирован, поэтому он будет более производительным, чем ваша собственная реализация. Ниже приведен полный образец:

internal partial class MyForm : Form
{
    internal MyForm()
    {
        myCharacters.AddRange(...);
    }

    List<string> myCharacters = new List<string>();

    private void ValidateButton_Click(object sender, EventArgs e)
    {
        if (myCharacters.Contains('?'))
        {
            // Do something
        }
    }
}
0 голосов
/ 15 мая 2011

Вам нужно будет сохранить список в статическом поле.Таким образом, у вас будет список в приложении.

class MyClass
{
    private static readonly List<char> _myCharList = new List<char>() { 'x', 'y', 'z' };
    public static List<char> MyCharList
    {
        get { return _myCharList; }

    }
}
0 голосов
/ 15 мая 2011

Есть какой-то способ просто инициализировать готовый список (мне не нужно добавлять или удалять элементы - я использую его почти как словарь).

Вы можете сделать переменную списка статической.

private static readonly string[] myList = new[] { "c1", "c2" };

Таким образом, она будет загружена один раз и будет храниться в памяти, как вы хотите.

Для поискаесли пользовательский ввод содержит символ из списка, используйте его:

string input = "adscads";
bool found = myList.Any(input.Contains);

(при условии .NET 3.5 или выше)

0 голосов
/ 15 мая 2011

Не бойтесь многократно инициализировать массив по соображениям производительности.1000 элементов вообще не должны занимать много времени.

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

public partial class Form1 : Form
{
    private List<string> kanjiList;
    public Form1()
    {
        kanjiList = new List<string>{"a", "b", "c"};
    }
}

Если вы хотите ускорить поиск, вы можете использовать HashSet<string> вместо List<string>, который будет иметь производительность поиска, сопоставимую с Dictionary.

...