Mam listę z takimi identyfikatorami:
List<long> docIds = new List<long>() { 6, 1, 4, 7, 2 };
Ponadto mam inną listę <T>
pozycji, które są reprezentowane przez opisane powyżej identyfikatory.
List<T> docs = GetDocsFromDb(...)
Muszę zachować tę samą kolejność w obu kolekcjach, aby pozycje w nich List<T>
były w tej samej pozycji, co w pierwszej (ze względu na punktację w wyszukiwarkach). A tego procesu nie da się wykonać w GetDocsFromDb()
funkcji.
W razie potrzeby można zmienić drugą listę na inną strukturę ( Dictionary<long, T>
na przykład), ale wolałbym tego nie zmieniać.
Czy istnieje prosty i skuteczny sposób wykonania tej „porządkowania w zależności od niektórych identyfikatorów” za pomocą LINQ?
c#
linq
sorting
collections
Borja López
źródło
źródło
docId
wystąpi dokładnie raz wdocs
, jaka właściwość będzie zawierałaId
selektor, czy teżFunc<T, long>
będzie potrzebny selektor ?Odpowiedzi:
źródło
Id
. Nie jest to określone w pytaniu.IndexOf
jest całkowicie do przyjęcia dla twojego przykładu i jest ładny i prosty. Gdybyś miał dużo danych, moja odpowiedź mogłaby być bardziej odpowiednia. stackoverflow.com/questions/3663014/…Ponieważ nie określasz
T
,To ogólne rozszerzenie tego, czego chcesz.
Możesz użyć rozszerzenia w ten sposób,
Mogłaby być bezpieczniejsza wersja
który zadziała, jeśli
source
nie zostanie dokładnie zapakowanyorder
.źródło
Odpowiedź Jodrella jest najlepsza, ale tak naprawdę to on ponownie zaimplementował
System.Linq.Enumerable.Join
. Join używa również Lookup i zachowuje kolejność źródeł.źródło
Jednym prostym podejściem jest spakowanie z sekwencją zamawiania:
źródło
Zip
łączy każdy indeks (w krotkę) z dokumentem na tej samej pozycji na odpowiedniej liście. Następnie OrderBy sortuje krotki według części indeksu, a następnie wybierz wykopuje tylko nasze dokumenty z uporządkowanej listy.Item1
nie jest to powiązaneItem2
.