1

我现在有 2 个列表:

list<string> names;
list<int> numbers;

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

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

4

4 回答 4

7

So i assume that the elements in both lists are related through the index.

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

But i would use another collection type like Dictionary<int,string> instead if both lists are related insomuch.

于 2012-11-11T15:30:52.750 回答
3

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

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

将两个序列“压缩”为一个。从那里您可以立即订购序列,例如

.OrderBy(a => a.number)

或者您可以改为创建一个Dictionary<,>,例如

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

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

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

或者,使用 a 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]);
于 2012-11-11T16:57:45.127 回答
0

我通过使用字典来修复它,结果如下:

dictionary.OrderBy(kv => kv.Value).Reverse().Select(kv => kv.Key).ToList();
于 2012-11-11T15:47:37.173 回答
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);
于 2012-11-11T15:42:18.027 回答