如何重新排列一个与另一个列表相同的列表?

时间:2019-04-16 07:47:45

标签: c#

我想重新排列与其他列表完全相同的列表。

List<string> list1= new List<string>();
            list1.Add("a");
            list1.Add("b");
            list1.Add("c");

List<string> list2= new List<string>();
            list2.Add("b");
            list2.Add("c");
            list2.Add("a");

现在我要重新排列与list1相同的list2,因此,在重新排列list2之后,它应该看起来像与list1相同的顺序

3 个答案:

答案 0 :(得分:4)

Linq方法

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

如果list2中不存在list1中的项目,则将其放在第一位,因为在这种情况下IndexOf返回-1

答案 1 :(得分:2)

IndexOf方法具有O(N)复杂度。因此,我提出了以下解决方案:

var list1 = new List<string> {"a", "b", "c"};
var list2 = new List<string> {"b", "c", "a"};

var list1Indexes = list1
    .Select((value, index) => (Index: index, Value: value))
    .ToDictionary(x => x.Value, x => x.Index);

list2 = list2
    .OrderBy(x => list1Indexes.TryGetValue(x, out var index) ? index : -1)
    .ToList();

通过键访问字典的元素是O(1)操作。

答案 2 :(得分:0)

对于包含字符串的列表,并假设两个列表具有相同的元素(但顺序不同),并且假定元素的比较区分大小写,则无需保留原始元素。字符串除了其值外,没有其他需要保留的隐藏身份。所以你在这里:

list1.Clear();
list1.AddRange(list2);