Сортировка по имени столбца строка - PullRequest
1 голос
/ 13 июня 2009

У меня есть наблюдаемая коллекция. Я хочу использовать linq для сортировки. У меня есть имя свойства свойства, которое я хочу отсортировать (как строку) для моего типа.

Какой самый лучший / быстрый способ сделать это?

Различные строки имени свойства будут переданы в функцию

Ответы [ 3 ]

2 голосов
/ 30 июня 2009

Вы можете сделать сортировку, используя лямбды. Я скопировал содержимое внутреннего класса, используемого DataGrid:

        IEnumerable<T> sortedList = _list.ToArray<T>();

        foreach (SortDescription sortDescription in SortDescriptions)
        {
            PropertyInfo propertyInfo = typeof(T).GetProperty(sortDescription.PropertyName);
            Func<T, object> keySelector = item => propertyInfo.GetValue(item, null);

            switch (sortDescription.Direction)
            {
                case ListSortDirection.Ascending:
                    sortedList = sortedList.OrderBy(keySelector);
                    break;
                case ListSortDirection.Descending:
                    sortedList = sortedList.OrderByDescending(keySelector);
                    break;
                default:
                    continue;
            }
        }

        T currentItem = _currentItem;

Работает довольно хорошо и лучше, чем пытаться найти IComparer.

2 голосов
/ 13 июня 2009

Я только смог сделать это с помощью отражения.

var v = YouList.OrderBy(t => t.GetType().InvokeMember(sField,
    System.Reflection.BindingFlags.GetProperty,
    null,
    t,
    null)
).ToList());

Я предполагаю, что тот же код будет работать для ObservableCollection ...

1 голос
/ 13 июня 2009

Вы должны иметь возможность построить выражение из имени этого свойства и передать его в OrderBy:

public IEnumerable<MyData> orderByDynamic(IEnumerable<MyData> objects, string propertyName) 
{
    var parameterExpression = Expression.Parameter(typeof(MyData), "x");
    var orderByExpression = Expression.Lambda<Func<MyData, TypeOfProperty>>(
        Expression.Property(parameterExpression, propertyName),
        parameterExpression);       
    return objects.OrderBy(orderByExpression)
}

Проблема в том, что вам нужно знать тип свойства во время компиляции, чтобы это работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...