#c# #list #sorting #datatable
#c# #Список #сортировка #datatable
Вопрос:
Есть ли способ отсортировать a, List<T>
используя строку типа "Name desc"
(такую же, как DataTable.DefaultView.Sort
), а не Linq?
Я пытаюсь заменить DataTables
на Lists
, и мне нужно, чтобы это было совместимо со старым кодом.
РЕШЕНИЕ
используя код V4Vendetta, я смог создать этот метод расширения, тесты, похоже, показывают, что он работает.
public static void SortByString<T>(this List<T> list, string sortString)
{
if (sortString == null) return;
List<string> SortGroups = sortString.Split(',').ToList();
for (int i = SortGroups.Count - 1; i >= 0; i--)// sort from the last group first
{
string tempColumn = SortGroups[i].Trim().Split(' ')[0];
bool isAsc = SortGroups[i].Trim().Split(' ').Length > 1 ? SortGroups[i].Trim().Split(' ')[1].ToLower() == "asc" ? true : false : true;
PropertyInfo propInfo = typeof(T).GetProperty(tempColumn);
if (propInfo == null) // if null check to make sure its not just a casing issue.
{
foreach (PropertyInfo pi in typeof(T).GetProperties())
{
if(pi.Name.ToLower() == tempColumn.ToLower())
{
tempColumn = pi.Name;
propInfo = typeof(T).GetProperty(tempColumn);
break;
}
}
}
if (propInfo != null)
{
Comparison<T> compare = delegate(T a, T b)
{
object valueA = isAsc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
object valueB = isAsc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);
return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
};
list.Sort(compare);
}else{
throw new IndexOutOfRangeException("Property: '" tempColumn "', does not exist in '" typeof(T).ToString() "'");
}
}
}
Ответ №1:
В списке есть несколько методов сортировки, а некоторые используют Comparison<T>
которые вы можете реализовать для пользовательского сравнения и сортировки
Комментарии:
1. Я попробовал это и узнал по пути. Но мне понравилось решение выше, спасибо
Ответ №2:
Насколько я знаю, встроенной поддержки для этого типа поиска нет. Поэтому вам придется написать свой собственный.
Разобрать строку не должно быть слишком сложно. Разделите его на запятые (,) на случай, если у вас есть строка сортировки типа «name asc, age desc» и обрабатывайте каждое из них как имя и направление. Затем вы можете использовать отражение типа T, чтобы найти свойство для сортировки и создать метод, который выполняет необходимое сравнение.
Посмотрите на эту статью о codeplex для примера: http://www.codeproject.com/KB/linq/dynamite_dynamic_sorting.aspx
Ответ №3:
Я попробовал кое-что в этих строках, возможно, вам нужно немного доработать это для ваших нужд
private List<Employee> CreateSortList<T>(
IEnumerable<Employee> dataSource,
string fieldName, SortDirection sortDirection)
{
List<Employee> returnList = new List<Employee>();
returnList.AddRange(dataSource);
// get property from field name passed
System.Reflection.PropertyInfo propInfo = typeof(T).GetProperty(fieldName);
Comparison<Employee> compare = delegate(Employee a, Employee b)
{
bool asc = sortDirection == SortDirection.Ascending;
object valueA = asc ? propInfo.GetValue(a, null) : propInfo.GetValue(b, null);
object valueB = asc ? propInfo.GetValue(b, null) : propInfo.GetValue(a, null);
//comparing the items
return valueA is IComparable ? ((IComparable)valueA).CompareTo(valueB) : 0;
};
returnList.Sort(compare);
return returnList;
}
Вам нужно передать соответствующее направление сортировки и имя поля, которое было бы свойством класса (в моем случае Employee)
Надеюсь, это поможет
Комментарии:
1. @g.foley Помогло ли это тебе?
Ответ №4:
В прошлом у меня был успех с динамической библиотекой запросов linq: http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx
Комментарии:
1. Забавно, учитывая немного о «без Linq» в названии этого вопроса.
2. Нередко люди объединяют LINQ со строго типизированными методами расширения. Библиотека динамических запросов позволяет сортировать список, используя вместо этого строку, что могло бы оказаться полезным.
Ответ №5:
Посмотрите на пространство имен специализированных коллекций. Там должен быть отсортированный список.