有什么方法可以讓 Search 和 addToSearch 更快?我正在努力讓它更快。我不確定 addtosearch 中的正則運算式是否有問題,它真的很小。我不知道如何進一步優化它。現在我只是想滿足字數。我想知道是否有一種方法可以比我更有效地連接不為空的名稱部分。
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System;
namespace AutoComplete
{
public struct FullName
{
public string Name;
public string Surname;
public string Patronymic;
}
public class AutoCompleter
{
private List<string> listOfNames = new List<string>();
private static readonly Regex sWhitespace = new Regex(@"\s ");
public void AddToSearch(List<FullName> fullNames)
{
foreach (FullName i in fullNames)
{
string nameToAdd = "";
if (!string.IsNullOrWhiteSpace(i.Surname))
{
nameToAdd = sWhitespace.Replace(i.Surname, "") " ";
}
if (!string.IsNullOrWhiteSpace(i.Name))
{
nameToAdd = sWhitespace.Replace(i.Name, "") " ";
}
if (!string.IsNullOrWhiteSpace(i.Patronymic))
{
nameToAdd = sWhitespace.Replace(i.Patronymic, "") " ";
}
listOfNames.Add(nameToAdd.Substring(0, nameToAdd.Length - 1));
}
}
public List<string> Search(string prefix)
{
if (prefix.Length > 100 || string.IsNullOrWhiteSpace(prefix))
{
throw new System.Exception();
}
List<string> namesWithPrefix = new List<string>();
foreach (string name in listOfNames)
{
if (IsPrefix(prefix, name))
{
namesWithPrefix.Add(name);
}
}
return namesWithPrefix;
}
private bool IsPrefix(string prefix, string stringToSearch)
{
if (stringToSearch.Length < prefix.Length)
{
return false;
}
for (int i = 0; i < prefix.Length; i )
{
if (prefix[i] != stringToSearch[i])
{
return false
}
}
return true
}
}
}
uj5u.com熱心網友回復:
正則運算式(Regexp)因其易用性和靈活性而非常棒,但大多數正則運算式引擎實際上都很慢。這是 C# 之一的情況。此外,字串可以包含 Unicode 字符,“\s”需要考慮 Unicode 字符集中包含的所有(花哨的)空格字符。這使得正則運算式搜索/替換要慢得多。如果您知道您的輸入不包含此類字符(例如 ASCII),那么您可以撰寫一個更快的實作。或者,您可以使用RegexpOptionslikeCompiled等CultureInvariant來減少運行時間。
執行AddToSearch許多隱藏分配。實際上, =創建一個新字串(因為 C# 字串是不可變的,并且不設計為經常調整大小)并且Replace呼叫也會分配新字串。您可以通過直接替換結果并將結果寫入預先分配的緩沖區來加快計算速度,然后Substring像您當前所做的那樣簡單地復制結果。
Search很好,優化它并不容易。話雖如此,如果listOfNames很大,那么您可以使用多個執行緒來顯著加快計算速度。不過要小心,因為Add它不是執行緒安全的。并行 linkq可以幫助您輕松地做到這一點(雖然我從未測驗過)。
加快計算速度的另一個解決方案是啟動fromSearch的回圈。實際上,如果大多數字串都包含前綴的開頭,那么大部分時間將花費在比較幾乎相等的字符上。高于的概率。此外,如果 JIT 無法做到這一點,部分回圈展開可能有助于加快功能。IsPrefixprefix.Length-1prefix[prefix.Length-1] != stringToSearch[prefix.Length-1]prefix[0] != stringToSearch[0]
uj5u.com熱心網友回復:
其他人已經指出,使用正則運算式可能會有問題。我個人會考慮使用 str.Replace(" ", String.Empty) - 如果我正確理解了正則運算式;我通常會盡量避免使用正則運算式,因為我很難使用正則運算式閱讀代碼。請注意, String.Empty 不會分配新字串。
也就是說,我認為如果您不將名稱存盤在串列中但至少按字母順序排列串列,則性能可能會提高。因此,您不需要迭代串列的所有元素,而是使用二進制搜索來查找與給定前綴匹配的所有元素 - 作為您已經擁有的名稱串列中的范圍。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/428141.html
