2013-10-05 3 views
2
var CustomStatus = new[] { "PAG", "ASG", "WIP", "COMP", "SEN" }; 

List<CDSHelper> HelperList = new List<CDSHelper>(); 
// Getting the values from API to fill the object and 
// finally doing the custom order by 

var result = HelperList.OrderBy(a => Array.IndexOf(CustomStatus, a.status)); 

Я использую пользовательский заказ для сортировки HelperList objects.I имеет около 18 статусов полностью .OUT от 18 статуса я хочу заказать список, основанный на CustomStatus, остальные порядка должен войти в список после состояния CustomStatus. Используя приведенный выше код, я могу получить CustomStatus в конце HelperList. Как добиться этого?Linq- Выпуска в произвольном порядке по

+0

Вы пытались создать список с настраиваемым статусом, добавленным с другими уставами, а затем использовать тот же порядок по выражению? – Sruti

+0

Остерегайтесь, что для большого количества предметов это может быть очень медленно. Ordeby - O (n * log n) и индекс O (n). Ваш индивидуальный порядок - O (n^2 * log n). – qub1n

+0

Да Его удар производительности. Но это то, что мое требование. Другой вариант - сначала извлечь данные списка на основе пользовательского статуса и поместить его в отдельный список, а затем, наконец, добавить нестандартные данные состояния в список. Какой из них лучший? – Oasis

ответ

3

Вероятно, самый простой способ сделать это заключается в использовании OrderBy затем ThenBy однако вы должны изменить -1IndexOf будет вернуться, если элемент не существует в более высокое значение, чтобы элементы не в списке стал последним.

var result = HelperList.OrderBy(a => { 
         var x = Array.IndexOf(CustomStatus, a.status); 
         if(x < 0) 
          x = int.MaxValue; 
         return x; 
        }).ThenBy(a => a.status); //Sort alphabetically for the ties at the end. 

Другой способ изменить порядок CustomStatus затем использовать OrderByDecending

var CustomStatus = new[] { "SEN", "COMP", "WIP", "ASG","PAG" }; 

List<CDSHelper> HelperList = new List<CDSHelper>(); 
// Getting the values from API to fill the object and 
// finally doing the custom order by 

var result = HelperList.OrderByDecending(a => Array.IndexOf(CustomStatus, a.status)) 
         .ThenBy(a.status); 
+0

Спасибо scott. Первый вариант отлично работает без этого. Потому что я не хочу сортировать по алфавиту. – Oasis

+0

Удивительный! Полностью помогли мне :-) – Hidan

0

Создать HashSet для CustomStatus. Вам не нужно знать индекс статуса в CustomStatus, вам нужно только знать, находится ли он в списке. Поиск в HashSet является операцией O (1). В массиве это О (п):

var CustomStatus = new HashSet<string> { "PAG", "ASG", "WIP", "COMP", "SEN" }; 

var result = HelperList.OrderBy(a => !CustomStatus.Contains(a.status)) 
         .ThenBy(a => a.status).ToList(); 

OrderBy сортирует список по логическому значению возвращаемого из !CustomStatus.Contains(a.status). Сначала все значения, содержащиеся в HashSet, затем остальные. Затем каждая группа упорядочивается по алфавиту по статусу.

Смежные вопросы