根据另一个列表对列表进行排序

时间:2018-06-05 14:40:06

标签: c#

我有list1这样:

{A,B,C,D,E,F}

我有另一个list2list2计数与list1计数相等(6 = 6):

{50,100,14,57,48,94}

我想根据list1排序list2list2按升序排序。

{14,48,50,57,94,100}

结果:

{C,E,A,D,F,B}

我使用了以下代码。但结果没有排序

list1= list1.OrderBy(d => list2.IndexOf(d)).ToList();

5 个答案:

答案 0 :(得分:4)

为什么不使用排序字典?

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]);
}

您现在可以按正确的顺序访问这些值。

答案 1 :(得分:4)

您可以使用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

答案 2 :(得分:2)

如果您使用数组而不是列表,则可以直接执行此操作:

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)方法是为了这个目的。

  

使用每个键的IComparable实现,根据第一个数组中的键对一对一维Array对象(一个包含键,另一个包含相应的项)进行排序。

可悲的是,List<T>没有相应的内容。

答案 3 :(得分:0)

试试这个:

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 };

答案 4 :(得分:0)

试试这个:

docs = docs.OrderBy(d => docsIds.IndexOf(d.Id)).ToList();

应该给出预期的结果。