按键的第二个元素排序字典
Order Dictionary by second element of Key
我正在寻找一种使用 c# 为以下数据制作(排序的)字典的简单方法。
人:
ID
Name
n4
Anne
n2
Ben
n3
Ben
n1
Cesar
订单:
PersonID
Description
n4
Salami
n4
Ananas
n3
Banana
n2
Apple
n1
Banana
n1
Cheese
对于每个人(ID 是唯一的,姓名不是)我应该有所有的订单。
我必须 显示按 Person.Name 排序的所有行,例如:
- 安妮:意大利腊肠、凤梨
- 本:苹果
- 本:香蕉
- 塞萨尔:香蕉、奶酪
字典的Values不是问题,而是Key。
我的第一种方法是使用 Person.ID 作为键:
Dictionary<string, Queue<Order>> lastOrders = new Dictionary<string, Queue<Order>>();
但后来我遇到了问题,字典没有排序(当我使用 SortedDictionary 时,它只会按 ID 而不是名称排序)。这意味着在 foreach 循环中我必须为每个键获取 Person.Name 并创建一个新的有序列表(?)并在新的 foreach 循环中使用它。
因为我需要 Person.ID(作为唯一标识符)和 Person.Name(用于排序)另一个选项可能是:
SortedDictionary<KeyValuePair<string, string>, Queue<Order>> lastOrders;
我认为第一个字符串必须是唯一 ID,第二个字符串必须是名称?
但是,字典再次首先按 ID 而不是名称排序?
因为PersonID永远不会改变(上面的例子不是很好,Persons是静态的,应用程序运行时Persons的数量不能改变),只有字典的Values改变,我认为使用排序字典(或排序一次)比在每次使用(显示)之前对其进行排序更好。
也许我想得太远了。你有更好的主意吗?谢谢
来自评论:
var persons = new SortedDictionary<Person, Queue<Order>>(Comparer<Person>.Create((p1, p2) => p1.Name.CompareTo(p2.Name)));
我正在寻找一种使用 c# 为以下数据制作(排序的)字典的简单方法。
人:
ID | Name |
---|---|
n4 | Anne |
n2 | Ben |
n3 | Ben |
n1 | Cesar |
订单:
PersonID | Description |
---|---|
n4 | Salami |
n4 | Ananas |
n3 | Banana |
n2 | Apple |
n1 | Banana |
n1 | Cheese |
对于每个人(ID 是唯一的,姓名不是)我应该有所有的订单。 我必须 显示按 Person.Name 排序的所有行,例如:
- 安妮:意大利腊肠、凤梨
- 本:苹果
- 本:香蕉
- 塞萨尔:香蕉、奶酪
字典的Values不是问题,而是Key。 我的第一种方法是使用 Person.ID 作为键:
Dictionary<string, Queue<Order>> lastOrders = new Dictionary<string, Queue<Order>>();
但后来我遇到了问题,字典没有排序(当我使用 SortedDictionary 时,它只会按 ID 而不是名称排序)。这意味着在 foreach 循环中我必须为每个键获取 Person.Name 并创建一个新的有序列表(?)并在新的 foreach 循环中使用它。
因为我需要 Person.ID(作为唯一标识符)和 Person.Name(用于排序)另一个选项可能是:
SortedDictionary<KeyValuePair<string, string>, Queue<Order>> lastOrders;
我认为第一个字符串必须是唯一 ID,第二个字符串必须是名称? 但是,字典再次首先按 ID 而不是名称排序?
因为PersonID永远不会改变(上面的例子不是很好,Persons是静态的,应用程序运行时Persons的数量不能改变),只有字典的Values改变,我认为使用排序字典(或排序一次)比在每次使用(显示)之前对其进行排序更好。 也许我想得太远了。你有更好的主意吗?谢谢
来自评论:
var persons = new SortedDictionary<Person, Queue<Order>>(Comparer<Person>.Create((p1, p2) => p1.Name.CompareTo(p2.Name)));