У меня list1 такой:
{A,B,C,D,E,F}
У меня есть еще один list2, количество list2 которого равно количеству list1 (6 = 6):
{50,100,14,57,48,94}
Я хочу отсортировать list1 в соответствии с list2, чтобы этот list2 был отсортирован по возрастанию.
{14,48,50,57,94,100}
как результат :
{C,E,A,D,F,B}
Я использовал следующий код. Но результат не отсортирован
list1= list1.OrderBy(d => list2.IndexOf(d)).ToList();
Как элементы в ваших двух списках полагаются друг на друга?
@HimBromBeere В другой функции они назначаются и полагаются друг на друга
Прочтите это stackoverflow.com/questions/9280054/…





Попробуй это:
int index = 0;
list1 = list1.OrderBy(d => list2[index++]).ToList();
Он должен дать ожидаемый результат с учетом следующих двух списков:
List<string> list1 = new List<string> { "A", "B", "C", "D", "E", "F" };
List<int> list2 = new List<int> { 50, 100, 14, 57, 48, 94 };
Почему бы не использовать отсортированный словарь?
var list1 = new List<int> { 50, 100, 14, 57, 48, 94 }
var list2 = new List<string> { "A", "B", "C", "D", "E", "F" };
var dict = new SortedDictionary<int, string>();
for (int i = 0; i < list1.Count; i++)
{
dict.Add(list1[i], list2[i]);
}
Теперь вы сможете получить доступ к значениям в правильном порядке.
Сравнимо с моим решением, но за один шаг. Определенно лучше
@ mm8 OP не просто сортирует список, они сортируют его по другим критериям. Кроме того, это позволяет им позже получить доступ к данным на основе индекса.
Попробуй это:
docs = docs.OrderBy(d => docsIds.IndexOf(d.Id)).ToList();
должен дать ожидаемый результат.
Вы можете сделать это напрямую, если используете массив вместо списка:
string[] list1 =
{
"A", "B", "C", "D", "E", "F"
};
int[] list2 =
{
50, 100, 14, 57, 48, 94
};
Array.Sort(list2, list1);
Console.WriteLine(string.Join(", ", list1)); // C, E, A, D, F, B
Метод Array.Sort(Array keys, Array items) предназначен именно для этой цели.
Sorts a pair of one-dimensional Array objects (one contains the keys and the other contains the corresponding items) based on the keys in the first Array using the IComparable implementation of each key.
К сожалению, для List<T> нет эквивалента.
Вы можете использовать Enumerable.Zip, чтобы объединить их, затем OrderBy, чтобы заказать
Применяет указанную функцию к соответствующим элементам двух последовательностей, создавая последовательность результатов.
var first = new List<char>() { 'A', 'B', 'C', 'D', 'E', 'F' };
var second = new List<double>() { 50, 100, 14, 57, 48, 94 };
var results = first.Zip(second, (f, s) => (first: f, second: s))
.OrderBy(x => x.second)
.Select(x => x.first);
Console.WriteLine(string.Join(", ", results ));
Выход
C, E, A, D, F, B
Стоит сказать, что для массивов есть встроенный метод решения этой конкретной проблемы: docs.microsoft.com/fr-fr/dotnet/api/…
Я прочитал это дважды и до сих пор не понимаю, о чем вы спрашиваете. Может я что-то упустил ...