private IList SortRows(IList rows, PropertyDescriptorCollection properties)
        {
            var sortedRows = rows.Cast <object>().Select((row, index) => new Tuple <object, List <object>, int>(row, new List <object>(), index)).ToArray();

            Array.Sort(sortedRows, (entry1, entry2) =>
            {
                var values1 = entry1.Item2;
                var values2 = entry2.Item2;
                for (int i = 0; i < properties.Count; i++)
                {
                    if (values1.Count == i)
                    {
                        values1.Add(properties[i].GetValue(entry1.Item1));
                    }
                    if (values2.Count == i)
                    {
                        values2.Add(properties[i].GetValue(entry2.Item1));
                    }
                    int result = _dataSchema.Compare(values1[i], values2[i]);
                    if (0 != result)
                    {
                        return(result);
                    }
                }
                return(entry1.Item3.CompareTo(entry2.Item3));
            });
            return(sortedRows.Select(entry => entry.Item1).ToArray());
        }