次のような方法で、正しい順序で別のリストを作成できます。
// 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
これには、元のコレクションを変更しないままにしておくという利点があります (それが重要な場合)。
オブジェクトへの参照を 2 つの異なるコレクションに保持するオーバーヘッドは、オブジェクトごとに 1 つのみの参照であるため、それほど高くはありません (さらに、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;}
}
}