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