C # Можно ли абстрагировать предложение LINQ orderby в параметр функции? - PullRequest
3 голосов
/ 06 июня 2011

У меня есть привязка ObservableCollection к представлению списка WPF. Я ищу, чтобы иметь возможность сортировать столбцы элемента управления ListView, нажав на заголовок столбца. Для этого я сортирую ObservableCollection и позволяю привязке позаботиться об обновлении GUI.

Для сортировки ObservableCollection я использую следующий код:

sortedData = new ObservableCollection<Tag>( from x in data
                                            orderby x.ID descending
                                            select x );
data = sortedData;

Примечание: данные привязаны к ListView

Проблема, с которой я сталкиваюсь, состоит в том, что для каждого из столбцов будет много кода копирования-вставки для достижения желаемого эффекта. Можно ли передать часть orderby x.ID по убыванию оператора LINQ в качестве параметра функции?

Или есть более простой способ достичь желаемого результата?

Ответы [ 6 ]

3 голосов
/ 06 июня 2011

Вы определяете функцию сортировки следующим образом:

Func<Tag, int> sortFunc = x => -x.ID;

(Сортировка по отрицательному идентификатору имеет тот же эффект, что и сортировка по убыванию идентификатора.)

Затем вы можете применить эту функцию сортировки к любому IEnumerable<Tag>:

var sortedData = new ObservableCollection<Tag>(data.OrderBy(sortFunc));
3 голосов
/ 06 июня 2011

Вы можете использовать Func в качестве параметра метода, содержащего лямбда-выражение.

Если вы хотите упорядочить каждый тип по его идентификатору, вы также можете указать интерфейс для всех этих типов и использовать универсальный метод.

Например

public ObservableCollection<Tag> Sort(Func<ObservableCollection<Tag>> sortFunc)  
{  
    //do something else  
    data = sortFunc();  
    //do something else  
}

который можно назвать как

Sort(list.OrderByDescending(x => x.ID));

, в списке которого находится ваша коллекция ObservableCollection.

1 голос
/ 06 июня 2011

Мне удалось добиться этого благодаря идее thekip о передаче Func в функцию, например

sortColumn( "ID", x => x.ID );

protected void sortColumn<T>( string name, Func<Tag, T> selector )
{
    ObservableCollection<Tag> sortedData = new ObservableCollection<Tag>( TagData.OrderBy( selector ) );

    data = sortedData;
}
0 голосов
/ 18 марта 2014

Вы можете использовать Динамический запрос. Он будет составлять операторы LINQ на лету, динамически, во время выполнения.

Например:

var query =
           db.Customers.Where("City == @0 and Orders.Count >= @1", "London", 10).
           OrderBy("CompanyName").
           Select("New(CompanyName as Name, Phone)");

Вы можете получить его здесь: http://code.msdn.microsoft.com/DynamicQuery-f65f6a4d

0 голосов
/ 06 июня 2011

Вы можете использовать Dynamic Linq для этого

с этим вы можете написать что-то вроде:

var sortExpr = "x.ID";

IQueryable<Tag> sortedQuery = query.OrderBy(sortExpr);

0 голосов
/ 06 июня 2011

Я думаю, что вы ищете Dynamic Linq.

Посмотрите, поможет ли этот образец: -

http://msdn.microsoft.com/en-gb/bb737920.aspx

http://msdn.microsoft.com/en-gb/bb737920.aspx

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