zoukankan      html  css  js  c++  java
  • 近音搜索,比较输入Z就可以搜索到拼音Z开头的汉字,搜索"浙江",只要输入"ZJ"就可以了


    相关算法如下:
    有兴趣可以测试一下,希望能给你带来帮助
     using System;
     
    using System.Text;
     
    using System.IO;
     
    namespace ts{
     
    class test{
     
    private static string[] startChars = {"""""","","","","","","","","","","","","","",
                  
    "","""","","","","","","",""}
    ;
       
    private static string[] endChars = {"""""","","","","","","","","","","","","","",
                   
    "","""","","","","","","",""}
    ;
     
       
    /// <summary>
       
    /// 根据字符和对应的中文字符,转成SQL查询条件
       
    /// </summary>
       
    /// <param name="cChar">要转化的字符,[A-Z]</param>
       
    /// <param name="strFieldName">条件左值</param>
       
    /// <returns>SQL条件</returns>
       
    /// <remarks> Sxf 2001-1-4 ***** JY 2002-1-4 </remarks>

       public static string GetCharCondition(char cChar, string strFieldName)
       
    {
        
    string strWord;
        
    int Index = (int)(char.ToUpper(cChar)) - (int)'A';
        
    if (Index >= 0 && Index < 26)
         strWord 
    = startChars[Index];
        
    else
         strWord 
    = startChars[0];
        
    //            return string.Format("(({0}>='{1}' AND {0}<'[') OR ({0} >= '{3}' AND {0} < '{{') OR {0}>='{2}')", 
        
    //                strFieldName, char.ToUpper(cChar), strWord, char.ToLower(cChar));
        return string.Format("(({0} >= '{3}' AND {0} <= 'zzzzzzzz') OR {0}>='{2}')"
         strFieldName, 
    char.ToUpper(cChar), strWord, char.ToLower(cChar));
       }

     
             
    /// <summary>
             
    /// 将指定字段值的每个字符分割,这样可以生成同音查询的SQL
             
    /// </summary>
             
    /// <param name="fieldName">字段名</param>
             
    /// <param name="fieldValue">字段值</param>
             
    /// <returns>生成的可以进行同音查询的SQL</returns>

       public static string GetCharFullCondition(string fieldName, string fieldValue)
       
    {
        StringBuilder sql 
    = new StringBuilder(1024);
        
    int i = 1;
        
    foreach (char c in fieldValue)
        
    {
         
    if (i > 1)
          sql.Append(
    " AND ");
         
    int index = (int)(char.ToUpper(c)) - (int)'A';
         
    string startWord, endWord;
         
    if (index >= 0 && index < 26)
         
    {
          startWord 
    = startChars[index];
          endWord 
    = endChars[index];
         }

         
    else
         
    {
          startWord 
    = startChars[0];
          endWord 
    = endChars[0];
         }

         
    string subStr = String.Format("SUBSTRING({0}, {1}, {2})", fieldName, i, 1);
         sql.AppendFormat(
    "({0} BETWEEN '{1}' AND '{2}')", subStr, startWord, endWord);
         
    ++i;
        }

     
        
    return sql.ToString();
       }

     }

     }
     
    我这个是基于SqlServer2000中的自定义函数的,如下:

    Create function getPY(@str nvarchar(4000))
    returns nvarchar(4000)
    as
    begin
    declare @word nchar(1),@PY nvarchar(4000)
    set @PY=''
    while len(@str)>0
    begin
    set @word=left(@str,1)
    --如果非汉字字符,返回原字符
    set @PY=@PY+(case when unicode(@word) between 19968 and 19968+20901
    then (select top 1 PY from (
    select 'A' as PY,N'驁' as word
    union all select 'B',N'簿'
    union all select 'C',N'錯'
    union all select 'D',N'鵽'
    union all select 'E',N'樲'
    union all select 'F',N'鰒'
    union all select 'G',N'腂'
    union all select 'H',N'夻'
    union all select 'J',N'攈'
    union all select 'K',N'穒'
    union all select 'L',N'鱳'
    union all select 'M',N'旀'
    union all select 'N',N'桛'
    union all select 'O',N'漚'
    union all select 'P',N'曝'
    union all select 'Q',N'囕'
    union all select 'R',N'鶸'
    union all select 'S',N'蜶'
    union all select 'T',N'籜'
    union all select 'W',N'鶩'
    union all select 'X',N'鑂'
    union all select 'Y',N'韻'
    union all select 'Z',N'咗'
    ) T
    where word>=@word collate Chinese_PRC_CS_AS_KS_WS
    order by PY ASC) else @word end)
    set @str=right(@str,len(@str)-1)
    end
    return @PY
    end

    调用方法是:

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using Microsoft.ApplicationBlocks.Data;

    namespace Function
    {
    public class 生成助记码
    {
    /// <summary>
    /// 根据汉字获取拼音首码
    /// </summary>
    /// <param name="Chinese"></param>
    /// <returns></returns>
    public static string GetPY(string Chinese)
    {
    SqlParameter [] param = new SqlParameter[1];
    param[0] = new SqlParameter("@中文",Chinese);

    try
    {
    object objPingYing = SqlHelper.ExecuteScalar(数据连接字串,CommandType.Text,"select dbo.GetPY(@中文)",param);
    if (objPingYing==null)
    {
    return string.Empty;
    }
    else
    {
    return objPingYing.ToString();
    }
    }
    catch
    {
    return string.Empty;
    }
    }

    }

  • 相关阅读:
    349. 两个数组的交集
    383. 赎金信
    242. 有效的字母异位词
    844. 比较含退格的字符串
    904. 水果成篮
    剑指offer(9)变态跳台阶
    剑指offer(8)跳台阶
    剑指offer(7)斐波那契数列
    剑指offer(6)旋转数组的最小数字
    剑指offer(5)用两个栈实现队列
  • 原文地址:https://www.cnblogs.com/luluping/p/1530523.html
Copyright © 2011-2022 走看看