[英]How to speed up AutoComplete in WinForms
我的以下代碼有些問題,需要幫助以使其適用於URI字符串。
當我鍵入a
, b
,...時,它可以工作。我知道我的List<URI>
正在收集地址,但是AutoComplete不適用於這些地址。
我確實調試了代碼, ProcessFile()
似乎可以正常工作並匹配URI並收集它們。 我一次看到七個地址。
但是totalUris
col.Add()
語句中的totalUris
實例為空。 我不知道為什么未填充totalUris
列表。 整個事情也有點慢。 我確實看到了WPF的類似功能,並且他們使用了關鍵字。
我想知道我是否也必須在這里這樣做,以及如何工作。 那是我入門的任何入門代碼,將不勝感激。
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void addItems(AutoCompleteStringCollection col)
{
string favorites = @"C:\Users\zohal\Favorites";
List<Uri> totalUris = new List<Uri>();
if (File.Exists(favorites))
{
// This path is a file
ProcessFile(favorites, out totalUris);
col.Add(totalUris.ToString());
}
else if (Directory.Exists(favorites))
{
// This path is a directory
ProcessDirectory(favorites,col);
col.Add(totalUris.ToString());
}
else
{
Console.WriteLine("No file or directory to process");
}
col.Add(totalUris.ToString());
col.Add("Abel");
col.Add("Bing");
col.Add("Catherine");
col.Add("Varghese");
col.Add("John");
col.Add("Kerry");
}
public static void ProcessDirectory(string targetDirectory, AutoCompleteStringCollection col)
{
List<Uri> favoriteUrisInCurrentDirectory = new List<Uri>();
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
//if (fileName == "desktop.ini") ???
//cumulativeUris.AddRange(favoriteUrisInCurrentDirectory = ProcessFile(fileName));
ProcessFile(fileName, out favoriteUrisInCurrentDirectory);
// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory,col);
}
// Insert logic for processing found files here.
public static void ProcessFile(string theFile, out List<Uri> totalUris)
{
Console.WriteLine("Processed file '{0}'.", theFile);
// Add the file to the list of internet shortcut files
StreamReader reader = File.OpenText(theFile);
System.String line;
List<Uri> favoriteUris = new List<Uri>();
while ((line = reader.ReadLine()) != null)
{
//Go through the file, and match any URIs, and add them to a list
Regex r = new Regex(@"(?<Protocol>\w+):\/\/(?<Domain>[\w@][\w.:@]+)\/?[\w\.?=%&=\-@/$,]*");
//Regex r = new Regex (@"http(s) ?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$");
//Regex r = new Regex(@"http(s) ?://([\w-]+.)+[\w-]+(/[\w- ./?%&=])?$");
//Regex r = new Regex(@"(((ht|f)tp(s?))\://)?(www.|[a-zA-Z].)[a-zA-Z0-9\-\.]+\.(com|edu|gov|mil|net|org|biz|info|name|museum|us|ca|uk)(\:[0-9]+)*(/($|[a-zA-Z0-9\.\,\;\?\'\\\+&%\$#\=~_\-]+))*$");
// Match the regular expression pattern against a text string.
Match m = r.Match(line);
Uri currentUri;
while (m.Success)
{
currentUri = new Uri(m.ToString());
favoriteUris.Add(currentUri);
m = m.NextMatch();
}
}
totalUris = favoriteUris;
}
private void personalUrisTextBox_TextChanged(object sender, EventArgs e)
{
personalUrisTextBox.AutoCompleteMode = AutoCompleteMode.Suggest;
personalUrisTextBox.AutoCompleteSource = AutoCompleteSource.CustomSource;
AutoCompleteStringCollection DataCollection = new AutoCompleteStringCollection();
addItems(DataCollection);
personalUrisTextBox.AutoCompleteCustomSource = DataCollection;
}
}
}
你有一個目錄
@“ C:\\ Users \\ zohal \\ Favorites”
因此將調用ProcessDirectory
方法,然后遍歷目錄的所有文件。 問題是您的ProcessFile
方法使用out關鍵字,這意味着將清除列表,然后在該文件中填充Uris。 因此,當最后一個文件被調用且為空時,列表將為空。
此外, ProcessDirectory
方法本身不會返回任何內容,也不會對輸入進行任何更改。 所以試試這個:
使用ref關鍵字而不是在這里:
public static void ProcessFile(string theFile, ref List<Uri> totalUris)
{
//.... rest of the code
totalUris.AddRange(favoriteUris);
}
還可以更改ProcessDirectory
方法:
public static void ProcessDirectory(string targetDirectory, ref List<Uri> totalUris)
{
// **avoid reconstructing the list:** List<Uri> favoriteUrisInCurrentDirectory = new List<Uri>();
// Process the list of files found in the directory.
string[] fileEntries = Directory.GetFiles(targetDirectory);
foreach (string fileName in fileEntries)
ProcessFile(fileName, ref totalUris);
// Recurse into subdirectories of this directory.
string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
foreach (string subdirectory in subdirectoryEntries)
ProcessDirectory(subdirectory, ref totalUris);
}
希望能幫助到你。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.