2014-02-20 3 views
1

У меня есть объекты, как показано ниже:Сортировка списка на основе другого атрибута в другом списке

public class CustomerSequence 
{ 
    public string CustomerName { get; set; } 
    public int Sequence { get; set; } 
} 

public class Customer 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Component { get; set; } 
} 

Допустим, у меня есть 2 Списки объектов

Customer:        CustomerSequence: 
Id   Name  Component  CustomerName   Sequence 
1   AAA   AAAAAA   AAA     2 
2   BBB   BBBBBBB  BBB     4 
3   CCC   CCCCC   CCC     1 
             DDD     3 

Как вы можете видеть, что нет DDD в списке.

Я хочу, чтобы отсортировать список клиентов на основе списка CustomerSequence

Результат является:

Customer: 
Id   Name  Component 
3   CCC   CCCCC 
1   AAA   AAAAAA 
2   BBB   BBBBBBB   

Любой человек может помочь мне, пожалуйста.

+0

Каково ожидаемое поведение, если в таблице последовательности нет соответствующей строки? –

+0

@BobVale Я не позволю этому произойти, так как я выбираю List на основе CustomerSequence.CustomerName. –

ответ

3

Регистрация как последовательности на имя клиента, а затем упорядочить по значению последовательности:

from c in customers 
join cs in customerSequences 
    on c.Name equals cs.CustomerName 
orderby cs.Sequence 
select c; 

Lambda синтаксис не так красиво, и это будет выглядеть

customers.Join(customerSequences, 
       c => c.Name, cs => cs.CustomerName, (c,cs) => new { c, cs }) 
     .OrderBy(x => x.cs.Sequence) 
     .Select(x => x.c) 

Внутренне присоединиться использует поиск для второй последовательности , что намного эффективнее линейного поиска с Where.


Если это возможно, что нет CustomerSequencs соответствия клиента, или есть более чем один матч, а затем использовать группу присоединиться:

from c in customers 
join cs in customerSequences 
    on c.Name equals cs.CustomerName into g 
orderby g.Select(cs => cs.Sequence).FirstOrDefault() 
select c 

Этот запрос использует 0 форму недостающего последовательности, и первый соответствует значение, если для клиента существует более одной последовательности.

2

Попробуйте

Customer.OrderBy(x => CustomerSequence.Where(y => y.CustomerName == x.Name) 
             .Select(y => y.Sequence) 
             .FirstOrDefault()) 

В качестве альтернативы вы можете использовать объединение, которое было бы лучше, если бы источник был база данных

var sorted = 
from c in customer 
join csj in customerSequence on c.Name equals csj.CustomerName into customerSequenceJoined 
from cs in customerSequenceJoined.DefaultIfEmpty() 
orderby cs == null ? 0 : cs.Sequence 
select c; 

В cs == null ? 0 : cs.Sequence рассматривается случай, когда нет соответствующих записей в сбор последовательности. Вы можете использовать int.MaxValue, если вы хотите, чтобы эти элементы отображались последними.

1

Использование Регистрация

var customers = from cust in Customer 
        join cust_seq in CustomerSequence 
        on cust.Name equals cust_seq.CustomerName   
        orderby cust_seq.Sequence 
        select cust; 
+0

Привет, я считаю, это orderby cust_seq.Sequence. –

+0

Да, вы правы, не обратили на это внимания и предположили, что и получите это;) –

0

Я предпочитаю использовать словарь для такого рода вещи.

var customerSequence = 
    customerSequences 
     .ToDictionary(x => x.CustomerName, x => x.Sequence); 

var sortedCustomers = 
    customers 
     .OrderBy(x => customerSequence[x.Name]) 
     .ToList(); 
Смежные вопросы