我想重新排列与其他列表完全相同的列表。
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相同的顺序
答案 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);