/// <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()); }
/// <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); }