From 005c68cc5b2b5cff2a7b8d89077df4c25b87f24b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=AD=B1=E5=82=91?= Date: Tue, 29 Nov 2022 13:10:00 +0800 Subject: [PATCH] Optimize search(#149 #163) --- Source/GrasscutterTools/Utils/UIUtil.cs | 69 ++++++++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/Source/GrasscutterTools/Utils/UIUtil.cs b/Source/GrasscutterTools/Utils/UIUtil.cs index 01be5d0..0827868 100644 --- a/Source/GrasscutterTools/Utils/UIUtil.cs +++ b/Source/GrasscutterTools/Utils/UIUtil.cs @@ -1,5 +1,6 @@ using System; using System.Linq; +using System.Text; using System.Threading.Tasks; using System.Windows.Forms; @@ -32,7 +33,7 @@ namespace GrasscutterTools.Utils /// 过滤内容 public static void ListBoxFilter(ListBox listBox, string[] source, string filter) { - filter = filter.Trim(); + filter = filter.Trim().ToLower(); listBox.BeginUpdate(); listBox.Items.Clear(); if (source != null && source.Length > 0) @@ -40,11 +41,75 @@ namespace GrasscutterTools.Utils if (string.IsNullOrEmpty(filter)) listBox.Items.AddRange(source); else - listBox.Items.AddRange(source.Where(n => n.Contains(filter)).ToArray()); + listBox.Items.AddRange(source.Where(n => Contains(n, filter)).ToArray()); } listBox.EndUpdate(); } + + private static bool Contains(string source, string filter) + { + source = source.ToLower(); + return source.Contains(filter) || (Encoding.Default.CodePage == 936 && ContainsPY(source, filter)); + } + + private static bool ContainsPY(string source, string filter) + { + int i = 0; + foreach (var ch in source) + { + var py = ch; + var bytes = Encoding.Default.GetBytes(new char[] { ch }); + if (bytes.Length == 2) + { + py = GetPinYing((bytes[0] << 8) + bytes[1]); + py = py == '\0' ? ch : py; + } + if (filter[i] == py) + i++; + else i = 0; + if (i == filter.Length) return true; + } + return false; + } + + /// + /// 获取拼音首字母,范围外返回原值 + /// + /// 字符 + /// 拼音首字母 + private static char GetPinYing(int i) + { + if (i < 45217) return '\0'; + if (i < 45253) return 'a'; + if (i < 45761) return 'b'; + if (i < 46318) return 'c'; + if (i < 46826) return 'd'; + if (i < 47010) return 'e'; + if (i < 47297) return 'f'; + if (i < 47614) return 'g'; + if (i < 48119) return 'h'; + if (i < 48119) return 'i'; + if (i < 49062) return 'j'; + if (i < 49324) return 'k'; + if (i < 49896) return 'l'; + if (i < 50371) return 'm'; + if (i < 50614) return 'n'; + if (i < 50622) return 'o'; + if (i < 50906) return 'p'; + if (i < 51387) return 'q'; + if (i < 51446) return 'r'; + if (i < 52218) return 's'; + if (i < 52698) return 't'; + if (i < 52698) return 'u'; + if (i < 52698) return 'v'; + if (i < 52980) return 'w'; + if (i < 53689) return 'x'; + if (i < 54481) return 'y'; + if (i < 55290) return 'z'; + return '\0'; + } + /// /// 使用浏览器打开网址 ///