public Dictionary <int, List <string[]> > CompareColumns(int SelectedColumn)
        {
            var Result = new Dictionary <int, List <string[]> >();

            try
            {
                List <string[]> col1 = null, col2 = null;
                var             task1 = new Task(() =>
                {
                    var col = new[] { FirstDatabase.TableColumns[SelectedColumn].Position };
                    col1    = FirstData.KeyPlusDataSelection(col).ToList();
                });
                task1.Start();
                var task2 = new Task(() =>
                {
                    var col = new[] { SecondDatabase.TableColumns[SelectedColumn].Position };
                    col2    = SecondData.KeyPlusDataSelection(col).ToList();
                });
                task2.Start();
                Task.WaitAll(task1, task2);
                Result.Add(1, col1);
                Result.Add(2, col2);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(null);
            }

            return(Result);
        }
        /// <summary>
        ///     Повертає порівняння лвох колонок як масив рядків
        /// </summary>
        /// <param name="SelectedColumn">Номер колонки</param>
        /// <returns></returns>
        public Dictionary <int, List <string[]> > CompareColumnsWithKeys(int SelectedColumn)
        {
            var Result = new Dictionary <int, List <string[]> >();

            try
            {
                //дістаєм імена колонок-ключів
                var list1 = FirstDatabase.TableColumns.Where(item => item.ISKey).ToList();
                var list2 = FirstDatabase.TableColumns.Where(item => item.ISKey).ToList();
                //Дістаєм мінімальну к-сть головних ключів з таблиць
                var min        = Math.Min(list1.Count, list2.Count);
                var FirstKeys  = new int[min + 1];
                var SecondKeys = new int[min + 1];
                //додаєм назви цих колонок до запитів
                for (var i = 0; i < min; i++)
                {
                    FirstKeys[i]  = list1[i].Position;
                    SecondKeys[i] = list2[i].Position;
                }

                List <string[]> col1 = null, col2 = null;
                var             task1 = new Task(() =>
                {
                    FirstKeys[min] = FirstDatabase.TableColumns[SelectedColumn].Position;
                    col1           = FirstData.KeyPlusDataSelection(FirstKeys).ToList();
                });
                task1.Start();
                var task2 = new Task(() =>
                {
                    SecondKeys[min] = SecondDatabase.TableColumns[SelectedColumn].Position;
                    col2            = SecondData.KeyPlusDataSelection(SecondKeys).ToList();
                });
                task2.Start();
                Task.WaitAll(task1, task2);
                Result.Add(1, col1);
                Result.Add(2, col2);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                return(null);
            }

            return(Result);
        }
        /// <summary>
        ///     Повертає словник з 2-х елементів
        ///     1-й FirstDb.Except(SecondDb)
        ///     2-й SecondDb.Except(FirstDb)
        /// </summary>
        /// <returns></returns>
        public Dictionary <int, List <string[]> > CompareFullData()
        {
            var Result = new Dictionary <int, List <string[]> >();

            try
            {
                List <string[]> col1 = null, col2 = null;
                var             sw        = new Stopwatch();
                var             FirstTask = new Task(() =>
                {
                    col1          = FirstData.Except(SecondData, new StringArrayComparer()).ToList();
                    var list1     = FirstDatabase.TableColumns.Where(item => item.ISKey).ToList();
                    var FirstKeys = new int[list1.Count];
                    if (list1.Count != 0)
                    {
                        var temp = col1.AsQueryable().OrderBy(i => i[list1[0].Position],
                                                              StringComparer.OrdinalIgnoreCase.WithNaturalSort());
                        for (var i = 1; i < list1.Count; i++)
                        {
                            FirstKeys[i] = list1[i].Position;
                            temp         = temp.ThenBy(j => j[FirstKeys[i]]);
                        }

                        col1 = temp.ToList();
                    }
                });
                sw.Start();
                FirstTask.Start();
                var SecondTask = new Task(() =>
                {
                    col2           = SecondData.Except(FirstData, new StringArrayComparer()).ToList();
                    var list2      = SecondDatabase.TableColumns.Where(item => item.ISKey).ToList();
                    var SecondKeys = new int[list2.Count];
                    if (list2.Count != 0)
                    {
                        var temp = col2.AsQueryable().OrderBy(i => i[list2[0].Position],
                                                              StringComparer.OrdinalIgnoreCase.WithNaturalSort());
                        for (var i = 1; i < list2.Count; i++)
                        {
                            SecondKeys[i] = list2[i].Position;
                            temp          = temp.ThenBy(j => j[SecondKeys[i]]);
                        }

                        col2 = temp.ToList();
                    }
                });
                SecondTask.Start();
                Task.WaitAll(FirstTask, SecondTask);
                Result.Add(1, col1);
                Result.Add(2, col2);
                FindUniqueDifferencess(ref Result);
                sw.Stop();
                AdditionalInfo.CompareTime = sw.Elapsed;
                AdditionalInfo.Different.Add(1, Result[1].Count);
                AdditionalInfo.Different.Add(2, Result[2].Count);
                AdditionalInfo.Unique.Add(1, Result[3].Count);
                AdditionalInfo.Unique.Add(2, Result[4].Count);
                AdditionalInfo.Same.Add(1,
                                        AdditionalInfo.Rows[1] - (AdditionalInfo.Different[1] + AdditionalInfo.Unique[1]));
                AdditionalInfo.Same.Add(2,
                                        AdditionalInfo.Rows[2] - (AdditionalInfo.Different[2] + AdditionalInfo.Unique[2]));
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
                return(null);
            }

            return(Result);
        }