예제 #1
0
        /// <summary>
        /// 大小判定用文字列取得
        /// </summary>
        /// <param name="pString">よみ文字列</param>
        /// <returns>判定用文字列</returns>
        public string GetCompareString(string pString)
        {
            CharReader    data = new CharReader(pString);
            StringBuilder sb   = new StringBuilder(pString.Length * 2);

            char c;

            CharReader.CharFlag flag;

            while (data.GetCharData(out c, out flag))
            {
                sb.Append(c);
            }

            return(sb.ToString());
        }
예제 #2
0
        /// <summary>
        /// 文字列大小判定(辞書読み順)
        /// </summary>
        /// <param name="pString1">よみ1</param>
        /// <param name="pString2">よみ2</param>
        /// <returns>負=pString2が大きい、0=等しい、正=pString1が大きい</returns>
        public int Compare(string pString1, string pString2)
        {
            CharReader reader1 = new CharReader(pString1);
            List <CharReader.CharFlag> flagList1 = new List <CharReader.CharFlag>(pString1.Length * 2);

            CharReader reader2 = new CharReader(pString2);
            List <CharReader.CharFlag> flagList2 = new List <CharReader.CharFlag>(pString2.Length * 2);

            bool blValid1, blValid2;
            char c1, c2;

            CharReader.CharFlag f1, f2;

            // かな順で判定
            while (true)
            {
                // よみ1,2から「よみ」を1文字取得
                blValid1 = reader1.GetCharData(out c1, out f1);
                blValid2 = reader2.GetCharData(out c2, out f2);

                // 文字列長で判定
                if ((blValid1 == false) && (blValid2 == false))
                {
                    break;
                }

                if ((blValid1 == true) && (blValid2 == false))
                {
                    return(1);
                }

                if ((blValid1 == false) && (blValid2 == true))
                {
                    return(-1);
                }

                // UNICODE順による大小判定
                int diff = c1 - c2;
                if (diff != 0)
                {
                    return(diff);
                }

                // 付加情報を記録
                flagList1.Add(f1);
                flagList2.Add(f2);
            }

            // 濁音などの付加情報で判定
            int i = 0;

            while (true)
            {
                // よみ1,2から付加情報を1つ取得
                blValid1 = i < flagList1.Count;
                if (blValid1)
                {
                    f1 = flagList1[i];
                }

                blValid2 = i < flagList2.Count;
                if (blValid2)
                {
                    f2 = flagList2[i];
                }

                // 文字列長で判定
                if ((blValid1 == false) && (blValid2 == false))
                {
                    break;
                }

                if ((blValid1 == true) && (blValid2 == false))
                {
                    return(1);
                }

                if ((blValid1 == false) && (blValid2 == true))
                {
                    return(-1);
                }

                // 付加情報で判定
                int diff = f1 - f2;
                if (diff != 0)
                {
                    return(diff);
                }

                i++;
            }

            // 同一と判定
            return(0);
        }