我现在有2个名单:
list<string> names;
list<int> numbers;
我需要根据数字中的值对我的名字进行排序。 我一直在搜索,大多数使用像x.ID这样的东西,但我真的不知道它的价值是什么。所以这不起作用。
有没有人知道,该做什么,或者可以帮助我在ID部分?
答案 0 :(得分:7)
所以我假设两个列表中的元素都是通过索引相关的。
names.Select((n, index) => new { Name = n, Index = index })
.OrderBy(x => numbers.ElementAtOrDefault(x.Index))
.Select(x => x.Name)
.ToList();
但我会使用另一种类似Dictionary<int,string>
的集合类型,如果两个列表都是相关的。
答案 1 :(得分:2)
这可能是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<int, string>();
foreach (var a in zipResultSequence)
sorted.Add(a.number, a.name);
或者,使用SortedDictionary<,>
,完全跳过Linq,就像:
var sorted = new SortedDictionary<int, string>();
for (int idx = 0; idx < numbers.Count; ++idx) // supposing the two list have same Count
sorted.Add(numbers[idx], names[idx]);
答案 2 :(得分:0)
为了补充Tims的答案,您还可以使用自定义数据结构将一个名称与数字相关联。
public class Person
{
public int Number { get; set; } // in this case you could also name it ID
public string Name { get; set; }
}
然后你会得到一个List<Person> persons;
,你可以按照你喜欢的任何属性对这个列表进行排序:
List<Person> persons = new List<Person>();
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);
答案 3 :(得分:0)
我通过字典来修复它,这就是结果:
dictionary.OrderBy(kv => kv.Value).Reverse().Select(kv => kv.Key).ToList();