2016-03-21 8 views
1

Я пытаюсь сортировать список по его именам, но я не знаю, как это сделать, когда у меня только есть идентификатор. Пример:Linq OrderBy - Получить имя по ID

public class CustomTask { 

    int categoryid; 
} 

public class DataOption { 
    int id; 
    string name; 
} 

public void Sort() { 

    List<DataOption> TheListContainingTheCategories = ...; 

    // The List containing my CustomTasks 
    List<CustomTask> listTempTasks = ... 
    var listTasksSorted = listTempTasks.OrderBy(...).ToList(); 
} 

Сортировка идентификаторов не очень сложно, но как я могу это сделать, когда я хочу, чтобы отсортировать их по именам?

Спасибо за вашу помощь

+1

Если я правильно понимаю, вы хотите, чтобы соответствовать CustomTask и DataOption по идентификатору, и сортировать по имени? Если да, взгляните на оператор 'Join' в Linq –

+2

Вы можете сортировать только по свойствам, входящим в ваш класс' 'CustomTask'', потому что этот класс не имеет никакого свойства' name', которое вы не можете отсортировать. – Alex

+0

вам нужен ваш класс 'CustomTask', чтобы включить свойство' Name', чтобы выполнить то, что вы просите. Иначе вы сможете сортировать по 'categoryid' –

ответ

0

Попробуйте это:

public void Sort() 
{ 
     List<DataOption> TheListContainingTheCategories = ...; 
     Dictionary<int, string> lookup = TheListContainingTheCategories.ToDictionary(x => x.id, x => x.name); 
     List<CustomTask> listTempTasks = new List<CustomTask>(); 
     var listTasksSorted = listTempTasks.OrderBy(c => lookup[c.categoryid]).ToList(); 
} 

при условии, что вы хотите отсортировать по совпадающим

DataOption.name когда DataOption.id == CustomTask.categoryId

1

Угадай наименьший способ сделать это

var listTasksSorted = from ct in listTempTasks 
         join d in TheListContainingTheCategories on ct.categoryid equals d.id 
         orderby d.name 
         select new {ct, d}; 

затем listTasksSorted выглядит как этот

linq result order by name

Так Список упорядочен по имени и идентификаторы вместе и нет необходимости дополнительных функций или членов

Альтернатива будет

var listTasksSortedAlternative = TheListContainingTheCategories.Where(d => 
           listTempTasks.Any(ct => 
           d.id == ct.categoryid)).OrderBy(d => d.name); 

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

alternative linq

+0

Или просто' select ct', если требуется OP DataOption только для сортировки –

+0

@KooKiz да просто взял все, что мог, потому что я не знаю, что ему нужно после сортировки;) –

+0

Hehehe ... Я полностью забыл о возможности присоединения xD – Alex