конкретный порядок Linq для SQL - PullRequest
9 голосов
/ 12 августа 2011

Можно ли заказать на Linq под конкретный заказ?что-то вроде

List<bbHeader> bb = new List<bbHeader>();
bb.OrderBy(x => x.Country.CompareTo(new string[]{"AR","CL","PY","UY","AUP"}));

Идея состоит в том, что поле Страна упорядочено в соответствии с определенным порядком строки

Ответы [ 2 ]

17 голосов
/ 12 августа 2011

В вашем примере есть очень прямой путь:

var sequence = new [] { "AR", "CL", "PY", "UY", "AUP" };

List<bbHeader> bb = new List<bbHeadher>();

// fill bb

// takes the item, checks the index of the country in the array
var result = bb.OrderBy(x => Array.IndexOf(sequence, x.Country));

Таким образом, вы упорядочиваете по индексу Страна, найденная в строке последовательности.Просто имейте в виду, что не найденные предметы будут иметь значение -1, которое вы также можете исправить, если хотите.

Если вы хотите сделать что-то более сложное, вы можете создать свой собственный класс IComparerреализация для сравнения товаров с использованием вашего индивидуального заказа.Затем это может быть передано в OrderBy.

Такой IComparer будет выглядеть так:

public sealed class SequenceComparer : IComparer<string>
{
    private string[] _sequence { get; set; }

    public SequenceComparer(string[] sequence)
    {
        if (sequence == null) throw new ArgumentNullException("sequence");

        _sequence = sequence;
    }

    public int Compare(string x, string y)
    {
        if (ReferenceEquals(x, y)) return 0;

        return Array.IndexOf(_sequence, x).CompareTo(Array.IndexOf(_sequence, y));
    }
}

И может быть вызван так:

var result = bb.OrderBy(x => x.Country, new SequenceComparer(new [] { "AR", "CL", "PY", "UY", "AUP" }));

В любом случае, хорошо работает,последний хорош и пригоден для повторного использования, но первый (использующий IndexOf напрямую) также очень лаконичен.Ваш выбор.

1 голос
/ 12 августа 2011

Вы можете передать свой собственный делегат функции orderby, и логика сравнения в этом случае может быть определена вами.

...