Сортировать список с использованием строки без Linq

#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:

Посмотрите на пространство имен специализированных коллекций. Там должен быть отсортированный список.