Windows手机应用程序t9预想英文
本文关键字:t9 手机 应用程序 Windows | 更新日期: 2023-09-27 18:27:08
我正在开发一个windows手机应用程序,它是一个拨号器,我在预测文本方面几乎没有问题。预测文本效果不错,但速度缓慢。我的代码是:
我在文本框的文本更改事件中添加了联系人搜索功能:
private void dialer_TextChanged(object sender, TextChangedEventArgs e)
{
try
{
MainPage.DialerText = dialer.Text;
contactSearch(MainPage.DialerText);
}
catch (Exception f)
{
MessageBox.Show(f.Message);
}
}
ContactSearch功能代码:
public void contactSearch(string str)
{
try
{
var digitMap = new Dictionary<int, string>() {
{ 1, "" },
{ 2, "[abcABC]" },
{ 3, "[defDEF]" },
{ 4, "[ghiGHI]" },
{ 5, "[jklJKL]" },
{ 6, "[mnoMNO]" },
{ 7, "[pqrsPQRS]" },
{ 8, "[tuvTUV]" },
{ 9, "[wxyzWXYZ]" },
{ 0, "" },
};
var enteredDigits = str;
var charsAsInts = enteredDigits.ToCharArray().Select(x => int.Parse(x.ToString()));
var regexBuilder = new StringBuilder();
foreach (var val in charsAsInts)
regexBuilder.Append(digitMap[val]);
var pattern = regexBuilder.ToString();
//append a ".*" to the end of the regex to make it "StartsWith", beginning for "EndsWith", or both for "Contains";
pattern = ".*" + pattern + ".*";
SearchListbox.ItemsSource = listobj.FindAll(x => x.PhoneNumbers.Contains(str) | Regex.IsMatch(x.FirstName, pattern));
}
catch (Exception e)
{
// MessageBox.Show(e.Message);
}
}
此代码运行良好,但缓慢。我需要加快速度。请提出一些改进建议。非常感谢。
这些解决方案可以改进它:
1-不要对重复的函数使用Try-catch:这可以很容易地降低性能,而不是尝试使用if-else
2-使用异步任务:它非常适合不阻塞UI,避免延迟和崩溃,但对任务使用较低的延迟时间,例如50ms;
3-使用其他收集类型:正如我在你的代码中看到的,你的字典键是从1开始的int。那么,为什么不使用一个数组或列表呢?它可以更快地处理更多的项目。像这样:string[]contacts={"contact 1"、"contact 2"、"contact 3"answers"contact 4"};
甚至是一个列表:
List<string> contacts = new List<string>();
contacts.Add("contact 1");
contact.Add("contact 2");
请注意,更改集合类型可能只会在大量数据中提高性能。
public interface ICellT9
{
void Add(string a_name);
List<string> GetNames(string a_number);
}
public class Cell : ICellT9
{
private Dictionary<int, Cell> m_nodeHolder;
private List<string> m_nameList;
public Cell()
{
m_nodeHolder = new Dictionary<int, Cell>();
for (int i = 2; i < 10; i++)
{
m_nodeHolder.Add(i, null);
}
}
public void Add(string a_name)
{
Add(a_name, a_name);
}
private void Add(string a_name, string a_originalName)
{
if ((string.IsNullOrEmpty(a_name) == true) && (string.IsNullOrEmpty(a_originalName) == false))
{
if (m_nameList == null)
{
m_nameList = new List<string>();
}
m_nameList.Add(a_originalName);
}
else
{
int l_firstNumber = CharToNumber(a_name[0].ToString());
if (m_nodeHolder[l_firstNumber] == null)
{
m_nodeHolder[l_firstNumber] = new Cell();
}
m_nodeHolder[l_firstNumber].Add(a_name.Remove(0, 1), a_originalName);
}
}
public List<string> GetNames(string a_number)
{
List<string> l_result = null;
if (string.IsNullOrEmpty(a_number))
{
return l_result;
}
int l_firstNumber = a_number[0] - '0';
if (a_number.Length == 1)
{
l_result = m_nodeHolder[l_firstNumber].m_nameList;
}
else if(m_nodeHolder[l_firstNumber] != null)
{
l_result = m_nodeHolder[l_firstNumber].GetNames(a_number.Remove(0, 1));
}
return l_result;
}
private int CharToNumber(string c)
{
int l_result = 0;
if (c == "a" || c == "b" || c == "c")
{
l_result = 2;
}
else if (c == "d" || c == "e" || c == "f")
{
l_result = 3;
}
else if (c == "g" || c == "h" || c == "i")
{
l_result = 4;
}
else if (c == "j" || c == "k" || c == "l")
{
l_result = 5;
}
else if (c == "m" || c == "n" || c == "o")
{
l_result = 6;
}
else if (c == "p" || c == "q" || c == "r" || c == "s")
{
l_result = 7;
}
else if (c == "t" || c == "u" || c == "v")
{
l_result = 8;
}
else if (c == "w" || c == "x" || c == "y" || c == "z")
{
l_result = 9;
}
return l_result;
}
}