Уменьшить многословность сортировки списка (мой) Linq - PullRequest
0 голосов
/ 08 марта 2012

У меня был набранный DataTable, который для сортировки был просто что-то вроде:

DataTable.DefaultView.Sort("sortexpression");

Поскольку выражение сортировки было строкой, я мог просто добавить поле и направление сортировки в пару строк, независимо от того, сколько вариантов сортировки у меня было. Теперь с Linq я явно делаю что-то очень неправильное, потому что чтобы сделать что-то подобное, я делаю это:

             this.GetSortExpressions();
        if ((ViewState["SortDirection"] as string) == "ASC")
        {
            switch (ViewState["SortField"] as string)
            {
                case "LKey":
                    this.SortedDetails = this.Details.OrderBy(d => d.LKey);
                    break;
                case "MName":
                    this.SortedDetails = this.Details.OrderBy(d => d.MaterialName);
                    break;
                case "FMSQOH":
                    this.SortedDetails = this.Details.OrderBy(d => d.FMSQOH);
                    break;
                case "CCQOH":
                    this.SortedDetails = this.Details.OrderBy(d => d.CCQOH);
                    break;
                case "FMSQOHVary":
                    this.SortedDetails = this.Details.OrderBy(d => d.FMSQOHVary);
                    break;
                default:
                    this.SortedDetails = this.Details.OrderBy(d => d.LKey);
                    break;
            }
        }
        else
        {
            switch (ViewState["SortField"] as string)
            {
                case "LKey":
                    this.SortedDetails = this.Details.OrderByDescending(d => d.LKey);
                    break;
                case "MName":
                    this.SortedDetails = this.Details.OrderByDescending(d => d.MaterialName);
                    break;
                case "FMSQOH":
                    this.SortedDetails = this.Details.OrderByDescending(d => d.FMSQOH);
                    break;
                case "CCQOH":
                    this.SortedDetails = this.Details.OrderByDescending(d => d.CCQOH);
                    break;
                case "FMSQOHVary":
                    this.SortedDetails = this.Details.OrderByDescending(d => d.FMSQOHVary);
                    break;
                default:
                    this.SortedDetails = this.Details.OrderByDescending(d => d.LKey);
                    break;
            }
        }

Это ужасно. Я обеспокоен тем, что я добавляю 2 * n операторов case для каждого нового поля сортировки. Как правильно, пожалуйста?

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Я прошел через это ... то, что я наконец нашел, было универсальным решением, использующим отражение для сортировки объекта IEnumerable.

http://zhousanfeng.wordpress.com/2009/12/01/a-generic-comparersorter-class%E8%BD%AC/

это будет, как вы могли бы использовать

Sorter<TestClass> sort = new Sorter<TestClass>(this.Deatils, "LKey ASC");
List<TestClass> sorted = sort.GetSortedList();

Привет.

0 голосов
/ 08 марта 2012

Присвойте Func методу orderby перед выполнением сортировки (не проверено):

public IOrderedEnumerable<TSource> OrderFunc<TSource, TKey>(
    this IEnumerable<TSource> source,
    Func<TSource, TKey> keySelector
);
OrderFunc order;
if ((ViewState["SortDirection"] as string) == "ASC")
    order = Enumerable.OrderBy;
else
    order = Enumerable.OrderByDescending;

switch (ViewState["SortField"] as string)
{
    case "LKey":
        this.SortedDetails = order(this.Details, d => d.LKey);
    break;
    case "MName":
        this.SortedDetails = order(this.Details, d => d.MaterialName);
    break;
    case "FMSQOH":
        this.SortedDetails = order(this.Details, d => d.FMSQOH);
    break;
    case "CCQOH":
        this.SortedDetails = order(this.Details, d => d.CCQOH);
    break;
    case "FMSQOHVary":
        this.SortedDetails = order(this.Details, d => d.FMSQOHVary);
    break;
    default:
        this.SortedDetails = order(this.Details, d => dLKey);
    break;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...