2011-05-15 68 views
1

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

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

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

+0

Windows应用程序 – aevanko 2011-05-15 06:04:07

回答

1

你存储在列表的收集和使用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

这是一个好主意,谢谢。我要在Windows窗体应用程序中初始化这个列表,以便它始终加载到Memeory中? – aevanko 2011-05-15 05:58:30

+0

@Issun,新增样本。 – 2011-05-15 06:02:23

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

+0

谢谢!我会给它一个! – aevanko 2011-05-15 06:01:35

0

这有什么办法,只是初始化预先制作的列表(我有没有必要添加或删除元素 - 我使用它几乎像一本字典)。

你可以让你的列表变量为静态的。

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

这样它将被加载一次,并将坐在内存中,如你所愿。

要搜索,如果用户输入包含从列表中使用的符号可以使用此:

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

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

0

你需要保持在一个静态字段列表。这样你就可以在整个应用程序中获得清单。

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

    } 
}