OrderBy с помощью String keySelector - PullRequest
       36

OrderBy с помощью String keySelector

5 голосов
/ 11 января 2011

У меня есть следующая функция, которая извлекает мне различные значения, основанные на свойствах объекта, здесь Клиент.

    public List<DistinctValue> GetDistinctValues(string propertyName)
    {
        //how should I specify the keySelector ?
        Func<string, object> keySelector = item => propertyName;

        var list = new List<DistinctValue>();
        var values = this.ObjectContext.Clients.Select(CreateSelectorExpression
                              (propertyName)).Distinct().OrderBy(keySelector);
        int i = 0;
        foreach (var value in values)
        {
            list.Add(new DistinctValue() { ID = i, Value = value });
            i++;
        }

        return list;
    }

    private static Expression<Func<Client, string>> CreateSelectorExpression
                                                        (string propertyName)
    {
        var paramterExpression = Expression.Parameter(typeof(Client));
        return (Expression<Func<Client, string>>)Expression.Lambda(
             Expression.PropertyOrField(paramterExpression, propertyName), 
                                                   paramterExpression);
    }

public class DistinctValue
{
    [Key]
    public int ID { get; set; }
    public string Value { get; set; }
}

Я делаю это, потому что раньше не знал, какие значения свойств мне нужно извлечь. Работает, просто результат не отсортирован.

Не могли бы вы помочь мне исправить сортировку, чтобы OrderBy работал должным образом?

Свойства являются строками, и мне не нужно цеплять сортировку. Мне также не нужно указывать порядок сортировки.

Большое спасибо заранее, Джон.

Ответы [ 2 ]

7 голосов
/ 11 января 2011

Ваш keySelector в настоящее время возвращает одинаковую строку для каждого (имя свойства);и поскольку LINQ обычно является стабильной сортировкой, это не приводит к общим изменениям.Поскольку вы уже спроецировали на строковые значения, вы можете просто использовать тривиальное отображение x=>x здесь:

var values = this.ObjectContext.Clients.Select(
    CreateSelectorExpression(propertyName)).Distinct().OrderBy(x => x);

для заказа самими элементами .

6 голосов
/ 04 февраля 2015

Спасибо за элегантное решение.Далее я расширил метод CreateSelectorExpression, чтобы его можно было использовать за пределами класса Client в приведенном выше примере.

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