在Windows窗体应用程序中初始化集合

时间:2011-05-15 05:52:08

标签: c# .net winforms unicode collections

我正在编写一个应用程序,它将检查输入到富文本框中的文本,并查看它是否包含特定列表之外的汉字(中文字符)。

我目前正在为我想要允许的1000个汉字使用字符串数组,我只是对用户输入中的每个元素进行for循环,并检查汉字是否在列表中。如果不是,我会在所有“不允许的”汉字的末尾返回一个列表。

我的问题是,我现在正在检查方法中创建字符串数组,当用户点击“检查”按钮时运行该方法,但我担心这意味着我每次操作时都会创建1000个汉字列表完成。我在哪里以及如何加载1000个汉字字符串数组,以便它始终加载到内存中?有没有办法只是初始化预制列表(我不需要添加或删除元素 - 我使用它几乎像字典)。

4 个答案:

答案 0 :(得分:1)

您最好将字符存储在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
        }
    }
}

答案 1 :(得分:0)

出于性能原因,不要害怕多次初始化阵列。 1000项不应该花费太多时间。

也就是说,如果你想确保它只是初始化一次你应该将列表声明为表单的私有成员并在构造函数中初始化列表。

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

如果您想加快查询速度,可以使用HashSet<string>代替List<string>,这样的查找效果可与Dictionary相媲美。

答案 2 :(得分:0)

  
    

有任何方法可以初始化预制列表(我不需要添加或删除元素 - 我使用它几乎就像字典一样)。

  

您可以将列表变量设为静态。

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

这样它就会被加载一次,并且会像你想要的那样位于内存中。

要搜索用户输入是否包含列表中的符号,可以使用:

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

(假设.NET 3.5或更高版本)

答案 3 :(得分:0)

您需要将列表保留在静态字段中。这样,您将在整个应用程序中拥有该列表。

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

    }
}