C#按其他列表排序列表

我现在有2个清单:

list names; list numbers; 

我需要根据数字中的值对我的名字进行排序。 我一直在搜索,大多数使用类似x.ID的东西,但我真的不知道那个值是什么。 所以这没用。

有谁知道,该做什么,或者可以帮助我在ID部分?

所以我假设两个列表中的元素都通过索引相关联。

 names.Select((n, index) => new { Name = n, Index = index }) .OrderBy(x => numbers.ElementAtOrDefault(x.Index)) .Select(x => x.Name) .ToList(); 

但我会使用另一种集合类型,如Dictionary如果两个列表都是相关的。

也许这是Zip方法的任务。 就像是

 names.Zip(numbers, (name, number) => new { name, number, }) 

将两个序列“压缩”成一个。 从那里你可以立即订购序列,比如

 .OrderBy(a => a.number) 

或者你可以改为创建一个Dictionary<,>

 .ToDictionary(a => a.number, a => a.name) 

但听起来你真正想要的是SortedDictionary<,> ,而不是一个由哈希码组织的Dictionary<,> 。 没有用于创建排序字典的LINQ方法,只是说

 var sorted = new SortedDictionary(); foreach (var a in zipResultSequence) sorted.Add(a.number, a.name); 

或者,使用SortedDictionary<,> ,完全跳过Linq,就像:

 var sorted = new SortedDictionary(); for (int idx = 0; idx < numbers.Count; ++idx) // supposing the two list have same Count sorted.Add(numbers[idx], names[idx]); 

为了补充Tims的答案,您还可以使用自定义数据结构将一个名称与一个数字相关联。

 public class Person { public int Number { get; set; } // in this case you could also name it ID public string Name { get; set; } } 

然后你会有一个List persons; 并且您可以按照您喜欢的任何属性对此列表进行排序:

 List persons = new List(); persons.Add(new Person(){Number = 10, Name = "John Doe"}); persons.Add(new Person(){Number = 3, Name = "Max Muster"}); // sort by number persons = persons.OrderBy(p=>p.Number).ToList(); // alternative sorting method persons.Sort((a,b) => a.Number-b.Number); 

我通过字典来修复它,这是结果:

 dictionary.OrderBy(kv => kv.Value).Reverse().Select(kv => kv.Key).ToList();