所以,我有一个排序字典,其中我的键是名字,值是姓氏。
我的表单上有一个列表框,显示用户可以从中选择姓氏的所有可能值。但是,由于名字是键,因此列表框中显示的这些值没有排序。
Andrews -> Carter -> Johnson
Carter -> Johnson -> Andrews
我希望姓氏按字母顺序排列,就像第一行一样,而不是现在的样子(第二行)。
创建一个只包含值的列表是最好的方法吗?我找不到任何方法对 ListBox 的内容进行内部排序,所以我不知道还能做什么。
所以,我有一个排序字典,其中我的键是名字,值是姓氏。
我的表单上有一个列表框,显示用户可以从中选择姓氏的所有可能值。但是,由于名字是键,因此列表框中显示的这些值没有排序。
Andrews -> Carter -> Johnson
Carter -> Johnson -> Andrews
我希望姓氏按字母顺序排列,就像第一行一样,而不是现在的样子(第二行)。
创建一个只包含值的列表是最好的方法吗?我找不到任何方法对 ListBox 的内容进行内部排序,所以我不知道还能做什么。
您可以按正确的顺序创建另一个列表,例如:
// Given that 'Person' for the sake of this example is:
public class Person
{
public string FirstName;
public string LastName;
}
// And you have a dictionary sorted by Person.FirstName:
var dict = new SortedDictionary<string, Person>();
// ...initialise dict...
// Make list reference a List<Person> ordered by the person's LastName
var list = (from entry in dict
orderby entry.Value.LastName
select entry.Value).ToList();
// Use list to populate the listbox
这样做的好处是不修改原始集合(如果这对您很重要)。
保持对两个不同集合中对象的引用的开销不是很高,因为每个对象只有一个引用(加上List<>
实现本身的一些固定开销)。
但是请记住,只要其中一个集合还活着,对象就会一直保持活动状态(除非您明确清除集合)。
可编译样本:
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo
{
public static class Program
{
private static void Main()
{
dict = new SortedDictionary<string, Person>();
addPerson("iain", "banks");
addPerson("peter", "hamilton");
addPerson("douglas", "adams");
addPerson("arthur", "clark");
addPerson("isaac", "asimov");
Console.WriteLine("--------------");
foreach (var person in dict)
Console.WriteLine(person.Value);
var list = (from entry in dict
orderby entry.Value.LastName
select entry.Value).ToList();
Console.WriteLine("--------------");
foreach (var person in list)
Console.WriteLine(person);
}
private static void addPerson(string firstname, string lastname)
{
dict.Add(firstname, new Person{FirstName = firstname, LastName = lastname});
}
private static SortedDictionary<string, Person> dict;
}
public class Person
{
public string FirstName;
public string LastName;
public override string ToString(){return FirstName + " " + LastName;}
}
}