2016-05-30 6 views
1

У меня есть два общих списки с двумя различными типами хранимых:Сортировка списка на основе другого?

class A { 
    public int id; 
    //... 
} 
class B { 
    public int id; 
    //... 
} 

Они разделяют подобную недвижимость, идентификатор. Теперь один список имеет определенный порядок объектов и их идентификаторы и вторые из них имеет совершенно иной порядок идентификаторов:

List<A> listA; // the ids of objects inside go as follows: 4, 5, 1 
List<B> listB; // the ids of objects inside go as follows: 1, 4, 5 

я хотел бы отсортировать LISTB так что listB[0].id==listA[0].id, listB[1].id==listA[1].id и т.д. Мысли об использовании Join, но нет идея, что положить в OrderBy.

+0

Почему вы не создать класс 'Mother' с идентификатором, сделать ваши два класса наследуют от него, то сортировать по ней? –

+2

'listB [1] .id == listA [2] .id' не должно быть' listB [1] .id == listA [1] .id'? – Nasreddine

+0

@Nasreddine yes, fixed, thx – user1255410

ответ

1

Вы можете временно создать анонимные объекты, содержащие требуемый индекс, а затем сортировать по этому показателю:

var result = listB.Select((b, index) => 
        new {Index = listA.FindIndex(a => a.id == b.id), 
          B = b}) 
        .OrderBy(b => b.Index) 
        .Select(b => b.B).ToList(); 

Таким образом, первый Select создает последовательность объектов, содержащих Index согласующего элемента в listA.
Эта последовательность затем упорядочивается по этому индексу, а окончательный Select выдает экземпляры с listB в правильном порядке.

1

Просто перебирать List<A> постатейных, найти соответствующий B элемент в экземпляре истока List<B> и хранить его в другой экземпляр назначения из List<B>. И все готово.

List<B> destinationListB = new List<B>(); 
foreach (A in listA) 
{ 
    B b = listB.FirstOrDefault(item => item.id = A.id); 
    if (b != nul) destinationListB.Add(b); 
} 

Отказ от ответственности: Там может быть больше времени, эффективное решение.

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