/// <summary>
 /// 野球選手名読み込み
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void ToolStripMenuItemLoadNameDB_Click(object sender, EventArgs e)
 {
     if (openFileDialogYakyuuName.ShowDialog() == DialogResult.OK)
     {
         yakyuuNameDic = new YakyuuDic(openFileDialogYakyuuName.FileName);
     }
 }
        /// <summary>
        /// 文字列からマッチする母音のラティス構造を生成します.
        /// </summary>
        /// <param name="tokens">文字列と同じ長さを持った空の配列</param>
        /// <param name="str">対象文字列</param>
        /// <param name="dic">野球名辞書データ</param>
        /// <param name="index">最初に呼び出す時はゼロ</param>
        private void makeLattice(YakyuuTokens[] tokens, String str, YakyuuDic dic, int index)
        {
            string _str   = "";
            int    length = str.Length;

            tokens[index] = new YakyuuTokens();

            for (int i = 1; index + i <= length; i++)
            {
                // 文字を1文字読みこむ
                _str += str[index + i - 1];

                // 該当の母音が存在するかを探す
                var readv = dic.selectReadV(_str);

                if (readv.Count() != 0)
                {
                    // 末尾まで探索が終了したらそれを辞書に追加する
                    if (index + i == length)
                    {
                        Debug.WriteLine("find token " + _str);
                        tokens[index].token.Add(_str, null);
                        return;
                    }

                    // もし一つでも存在し, かつその先の探索が行なわれてなければ
                    // そこから再帰的に探索をする.
                    if (tokens[index + i] == null)
                    {
                        makeLattice(tokens, str, dic, index + i);
                    }

                    // その先からの探索が成功していれば
                    // 単語の追加を行う.
                    if (tokens[index + i].token.Count != 0)
                    {
                        Debug.WriteLine("find token " + _str);
                        tokens[index].token.Add(_str, tokens[index + i]);
                    }
                }
            }
        }
 /// <summary>
 /// 文字列からラティス構造を生成する.
 /// </summary>
 /// <param name="str">対象文字列</param>
 /// <param name="dic">野球選手名辞書オブジェクト</param>
 public LatticedString(String str, YakyuuDic dic)
 {
     tokens     = new YakyuuTokens[str.Length];
     baseString = str;
     makeLattice(tokens, str, dic, 0);
 }
 /// <summary>
 /// フォームが読まれた時の動作.
 /// 辞書データをnull初期化してるだけ.
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void Form1_Load(object sender, EventArgs e)
 {
     yakyuuNameDic = null;
 }
        /// <summary>
        /// 歌詞を野球選手名の読みのトークン列に変換する関数
        /// </summary>
        /// <param name="dic"></param>
        /// <returns></returns>
        public String convertLyricYakyuu(YakyuuDic dic)
        {
            LyricsYakyuu.Flush();
            StringReader lybRd = new StringReader(lyricsVowel.ToString());
            String       lyb;
            StringWriter buf  = new StringWriter();
            StringWriter bufY = new StringWriter();
            var          dt   = dic.ReadTable;

            {
                foreach (var r in dt)
                {
                    Debug.WriteLine(r.NameReadV);
                }
            }

            lyb = lybRd.ReadLine();

            while (lyb != null)
            {
                foreach (Char c in lyb)
                {
                    buf.Write(c); //バッファに文字を1文字追加

                    var _buf = buf.ToString();

                    if (_buf.Length >= 2)
                    {
                        // 完全一致の検索
                        var rows = from r in dt
                                   where r.NameReadV == _buf
                                   select r;

                        if (rows.Count() != 0) // 一致する物があった場合
                        {
                            // その選手名をバッファに書きこむ
                            bufY.Write(rows.ElementAt(0).NameRead);
                            bufY.Write("/");
                            Debug.WriteLine(_buf + ":" + rows.ElementAt(0).NameRead);
                            buf = new StringWriter();
                        }
                        else
                        {
                            // 前方一致の検索
                            var rowsp = from r in dt
                                        where _buf.StartsWith(r.NameReadV)
                                        select r;
                            //var rowsp = dt.Select("readV like \'" + buf.ToString() + "%\'");
                            if (rowsp.Count() == 0 && _buf.Length > 2)
                            {   // 前方一致も無かった場合は
                                var    length = _buf.Length;
                                string _lyb   = _buf.Substring(0, length - 1);
                                // 1文字だけ消してみる
                                var aimai = from r in dt
                                            where r.NameReadV.Length == length && r.NameReadV.Substring(0, length - 1) == _lyb
                                            select r;
                                //var q = "readV like \'" + _lyb.Substring(0, _lyb.Length - 1) + "%\'";
                                //var aimai = dt.Select(q);
                                if (aimai.Count() == 0) // やっぱりヒットしなかったら
                                {
                                    //バッファの内容をそのまま書きこむ
                                    bufY.Write("(" + _buf + ")");
                                }
                                else
                                {
                                    // ヒットしたらそれを入れる
                                    bufY.Write("[" + aimai.ElementAt(0).NameRead + "]/");
                                    Debug.WriteLine(_buf + ":" + aimai.ElementAt(0).NameRead);
                                }
                                buf = new StringWriter();
                            }
                        }
                    }
                }
                // 行を全て読んでしまったらバッファを書きこむ
                bufY.Write(buf.ToString());
                buf = new StringWriter();

                // 選手名バッファの内容を変換後歌詞に書きこむ
                LyricsYakyuu.WriteLine(bufY.ToString());
                bufY = new StringWriter();

                // もう一行読みこむ
                lyb = lybRd.ReadLine();
            }

            return(LyricsYakyuu.ToString());
        }