替换列表中的特殊字符,以便您可以轻松搜索它们

本文关键字:搜索 列表 特殊字符 替换 | 更新日期: 2023-09-27 18:25:29

我正在下载一个xml文件并将其保存到手机(Windows Phone 8应用程序(,然后将其作为列表打开。此列表中包含希腊语单词,带有大写、小写和特殊字符。我希望用户能够通过此列表进行搜索,而不会让他编写与列表中相同的文本,因此,到目前为止,我将搜索栏和列表变成大写字符,因此如果用户键入"to",列表会突出显示"to","To","TO"暂时删除不匹配的单词,调出匹配的单词。但是,如果用户尝试在没有语调的情况下写一个字母,则列表中具有语调的单词将全部被删除,直到用户按退格键并键入带有语调的字母。

示例:列表有 2 个单词。 Σπύρος , Μάρα.用户按下字母"Μ",在列表中,Σπύρος消失,Μάρα变为Μάρα。现在用户输入"α",Mάρα也消失了,因为他必须输入"ά"。如果他有,那就是Μάρα等等。

所以我的问题是,是否有可能将一个带有语调的字符替换为没有语调的同一字符?例如。ά 到 a,Ά 到 A,等等。在 Unicode 字符表上,它们具有不同的代码。

到目前为止的代码:

  private void businessFilterString_TextChanged(object sender, TextChangedEventArgs e)
    {
        sI.ItemsSource = businesses.Collection.Where(b => b.name.ToUpper().Contains(searchBox.Text.ToUpper()) || b.address.ToUpper().Contains(searchBox.Text.ToUpper())).ToList();
        LayoutUpdateFlag = true;
    }
    private void sI_LayoutUpdated(object sender, EventArgs e)
    {
        if (LayoutUpdateFlag)
        {
           SearchVisualTree(sI);
        }
        LayoutUpdateFlag = false;
    }
    private void SearchVisualTree(DependencyObject targetElement)
    {
        var count = VisualTreeHelper.GetChildrenCount(targetElement);
        for (int i = 0; i < count; i++)
        {
            var child = VisualTreeHelper.GetChild(targetElement, i);
            if (child is TextBlock)
            {
                textBlock1 = (TextBlock)child;
                prevText = textBlock1.Text.ToUpper();
                HighlightText();
            }
            else
            {
                SearchVisualTree(child);
            }
        }
    }
  private void HighlightText()
  {
      if (textBlock1 != null)
      {
          string text = textBlock1.Text.ToUpper();
          textBlock1.Text = text;
          textBlock1.Inlines.Clear();
          int index = text.IndexOf(searchBox.Text.ToUpper());
          int lenth = searchBox.Text.Length;

          if (!(index < 0))
          {
              Run run = new Run() { Text = text.Substring(index, lenth), FontWeight = FontWeights.ExtraBold};
              run.Foreground = new SolidColorBrush(Colors.Orange);
              textBlock1.Inlines.Add(new Run() { Text = text.Substring(0, index), FontWeight = FontWeights.Normal});
              textBlock1.Inlines.Add(run);
              textBlock1.Inlines.Add(new Run() { Text = text.Substring(index + lenth), FontWeight = FontWeights.Normal });
          }
          else
          {
              //textBlock1.Text = "No Match";
          }
      }
  }

替换列表中的特殊字符,以便您可以轻松搜索它们

所以我

添加了

  private static string DeleteAccentAndSpecialsChar(string OriginalText)
    {
        string strTemp = OriginalText;
        Regex rega = new Regex("[Ά]");
        Regex rege = new Regex("[Έ]");
        Regex regi = new Regex("[Ί]");
        Regex regu = new Regex("[Ύ]");
        Regex regh = new Regex("[Ή]");
        Regex rego = new Regex("[Ό]");
        Regex regw = new Regex("[Ώ]");
        strTemp = rega.Replace(strTemp, "Α");
        strTemp = rege.Replace(strTemp, "Ε");
        strTemp = regi.Replace(strTemp, "Ι");
        strTemp = regu.Replace(strTemp, "Υ");
        strTemp = regh.Replace(strTemp, "Η");
        strTemp = rego.Replace(strTemp, "Ο");
        strTemp = regw.Replace(strTemp, "Ω");
        return strTemp;
    }

并更改了

   private void businessFilterString_TextChanged(object sender, TextChangedEventArgs e)
{
    sI.ItemsSource = businesses.Collection.Where(b => b.name.ToUpper().Contains(searchBox.Text.ToUpper()) || b.address.ToUpper().Contains(searchBox.Text.ToUpper())).ToList();
    LayoutUpdateFlag = true;
}

  private void businessFilterString_TextChanged(object sender, TextChangedEventArgs e)
    {
        sI.ItemsSource = businesses.Collection.Where(b => DeleteAccentAndSpecialsChar(b.name.ToUpper()).Contains(DeleteAccentAndSpecialsChar(searchBox.Text.ToUpper()))).ToList();
        LayoutUpdateFlag = true;
    }

这样,所有文本都显示在上部,语调消失。仍然如果用户在他的文本上使用语调,则不会显示任何内容,但非常适合我,因为上部文本不需要语调。