2012-01-27 4 views
3

Явно Можно ли использовать LINQ OrderBy так:LINQ - OrderBy

.OrderBy(x=>(x.SourceID == 3), (x.SourceID == 2), (x=>x.SourceID == 4), (x.SourceID == 1)).ToList(); 

Так закажу их 3, 2, 4, 1?

+0

Я никогда не знал, что у «OrderBy» было такое расширение. – Bastardo

+0

Это не что-то похожее на то, что я могу использовать для явного упорядочения списка сложного типа данных? – CallumVass

+0

try OrderBy(). ThenBy() – hyp

ответ

2

Принимая ответ Йоахима Isaksson в выше, это может быть завернуты в метод расширения:

public static class ListExtensions 
{ 
    public static List<Source> SortByCustomOrder(this List<Source> list, List<int> sortOrder) 
    { 
     return list.OrderBy(x => sortOrder.IndexOf(x.SourceId)).ToList(); 
    } 
} 

замены источника с классом и x.SourceId с вашей собственностью

Использование:

// the sort order 
var sortOrder = new List<int> { 3, 2, 4, 1, 6, 5 }; 
var results = sources.SortByCustomOrder(sortOrder); 
+0

Это решение сработало! – CallumVass

7

Нет, это не действительное выражение лямбда. То, что вы могли бы сделать, это нечто подобное;

var sortOrder = new List<int> {3, 2, 4, 1}; 
var result = bop.OrderBy(x=> sortOrder.IndexOf(x.SourceID)).ToList(); 

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

+0

Когда я пытаюсь это сделать, я получаю: LINQ to Entities не распознает метод Int32 IndexOf (Int32), и этот метод не может быть переведен в выражение хранилища. – CallumVass

+0

Ах, тогда ваш поставщик Linq (Linq2NHibernate? Linq2Entities?) Не поддерживает IndexOf. Что является основным поставщиком Linq? –

+0

Как бы это узнать? – CallumVass