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
并且您可以按照您喜欢的任何属性对此列表进行排序:
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();