I have a list1
like this :
{A,B,C,D,E,F}
I have another list2
that list2
count is equal with l
Why not use a sorted dictionary?
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]);
}
You'll now be able to access the values in the correct order.
You can do this directly if you use an array instead of a list:
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
The Array.Sort(Array keys, Array items) method is provided for this exact purpose.
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.
Sadly, there is no equivalent for List<T>
.
Try this:
int index = 0;
list1 = list1.OrderBy(d => list2[index++]).ToList();
It should produce the expected result given the following two lists:
List<string> list1 = new List<string> { "A", "B", "C", "D", "E", "F" };
List<int> list2 = new List<int> { 50, 100, 14, 57, 48, 94 };
Try this:
docs = docs.OrderBy(d => docsIds.IndexOf(d.Id)).ToList();
should give the expected result.
You could use Enumerable.Zip to combine them, then OrderBy
to order
Applies a specified function to the corresponding elements of two sequences, producing a sequence of the results.
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 ));
Output
C, E, A, D, F, B