Dobrze prosty - ale nieefektywne - sposób byłoby:
var result = _lstNeedToOrder.OrderBy(x => _lstOrdered.IndexOf(x));
Alternatywą byłoby wypracować daleko sposób uzyskania pożądanego indeks wartości. Jeśli twoje wartości zawsze będą w zakresie [1 ... n], możesz po prostu odwrócić tę "uporządkowaną listę" na "listę indeksów według wartości". W którym momencie można użyć:
var result = _lstNeedToOrder.OrderBy(x => indexes[x]);
(gdzie indexes
miałoby dodatkową wartość na początku 0, tak aby rzeczy prostsze).
Alternatywnie można utworzyć wartość Dictionary<int, int>
z indeksu. Byłoby to bardziej ogólne, ponieważ poradziłoby sobie z bardzo szerokim zakresem wartości bez zajmowania dużej ilości pamięci. Ale wyszukiwanie słownika jest oczywiście mniej wydajne niż wyszukiwanie tablicy lub listy.
Podobnie jak marginesie, które nie byłoby dobrze sformatować jako komentarz, twój inicjalizacji można uprościć stosując inicjator kolekcji:
var listToOrder = new List<int> { 1, 5, 6, 8 };
var orderedList = new List<int> { 13, 5, 11, 1, 4, 9, 2, 7, 12, 10, 3, 8, 6 };
Hej Jon, przepraszam Jeśli to głupie pytanie, ale dlaczego pierwszy nieefektywny? –
@DimitarDimitrov: Używa 'IndexOf' do znalezienia żądanego indeksu każdego wpisu. Jest to operacja O (n) w rozmiarze '_lstOrdered', niepotrzebnie. –
@DimitarDimitrov może dlatego, że użycie 'IndexOf'? –