/// <summary>
        /// 複数のドロップサマリーのマージ
        /// </summary>
        /// <param name="target">対象のサマリー</param>
        /// <returns>マージされたサマリー</returns>
        public DropSummary Merge(DropSummary target)
        {
            //自分自信をディープコピー
            var result = new DropSummary();

            foreach (var r in this)
            {
                result[r.Key] = r.Value.DeepCopy();
            }

            //ターゲットをマージ
            foreach (var t in target)
            {
                DropResult item;
                //マージ可能な場合
                if (result.TryGetValue(t.Key, out item))
                {
                    result[t.Key] = item.Merge(t.Value);
                }
                else
                {
                    result[t.Key] = t.Value.DeepCopy();
                }
            }

            return(result);
        }
        //コンストラクタ
        public Analyzer(IEnumerable <KCVDBRow> parsedFullTextLines)
        {
            if (parsedFullTextLines == null)
            {
                throw new NullReferenceException("parsedFullTextDataがNullです");
            }

            this.ParsedFullTextLines = parsedFullTextLines;

            this.MapInfo = new List <ApiMapInfo>();
            this.NowCell = new ApiRashin();

            this.Summary = new DropSummary();
        }
        static void Main(string[] args)
        {
            //------ パラメーター設定
            var files = Directory.GetFiles(@"Enter your log-file directory");
            int id    = 155;                          //U-511 431 ターゲットのID

            int[]  sameids  = new int[] { 155, 403 }; //同一とみなす艦のID
            string shipname = "伊401";
            string date     = "2016/05/03";
            //-------------------------

            //--同一艦
            //new int[] { 431, 334, 436 };//U-511 431
            //new int[] { 155, 403 };//伊401 155
            //new int[] { 421, 330 };//秋月 421
            //new int[] { 422, 346 };//照月 421


            var totalsummary = new DropSummary();
            int cnt          = 1;

            Console.Title = "Started : " + DateTime.Now;

            Parallel.ForEach(files, new ParallelOptions {
                MaxDegreeOfParallelism = 2
            }, f =>
            {
                Console.WriteLine("Analyzing {0} / {1}", cnt, files.Length);
                cnt++;

                var ext = Path.GetExtension(f);
                if (ext != ".gz" && ext != ".log")
                {
                    return;
                }


                var fullline = KCVDBLogFile.ParseAllLines(f);
                var analyzer = new Analyzer(fullline);

                //解析
                analyzer.Analyze(id, sameids);

                //テーブルのマージ
                if (analyzer.Summary != null)
                {
                    lock (lockObject)
                        totalsummary = totalsummary.Merge(analyzer.Summary);
                }
            });


            //結果表示用
            StringBuilder sb = new StringBuilder();

            sb.AppendFormat("ID = {0} {1}({2})", id, shipname, date).AppendLine();
            foreach (var d in totalsummary.OrderBy(x => x.Key.GetHashCode()))
            {
                //if (d.Value.GetDropRatio(id) == 0.0) continue;

                var prob = d.Value.GetDropRatio(id);
                var num  = d.Value.GetDropNum(id);
                var ci95 = Statics.ConfidenceIntervalBinomial(prob, d.Value.TotalNum);

                sb.Append(d.Key.GetDisplayString());
                sb.Append("\t");
                sb.Append(ci95.Lower.ToString("P2"));
                sb.Append("\t");
                sb.Append(prob.ToString("P2"));
                sb.Append("\t");
                sb.Append(ci95.Upper.ToString("P2"));
                sb.Append("\t");
                sb.Append(num);
                sb.Append("\t");
                sb.Append(d.Value.TotalNum);

                sb.AppendLine();
            }
            Console.WriteLine(sb.ToString());

            File.WriteAllText(id + "_" + date.Replace("/", "") + ".txt", sb.ToString());
        }