0

したがって、キーが名であり、値が姓であるソート済み辞書があります。

ユーザーが姓を選択できるすべての可能な値を表示するフォームにリストボックスがあります。ただし、名はキーであるため、リスト ボックスに表示されるこれらの値は並べ替えられません。

Andrews -> Carter -> Johnson

Carter -> Johnson -> Andrews

姓を現在の状態 (2 行目) ではなく、1 行目のようにアルファベット順に並べたいと思います。

値のみを含むリストを作成することは、これを行うための最良の方法でしょうか? ListBox の内容を内部的に並べ替える方法が見つからなかったので、他に何ができるか途方に暮れました。

4

1 に答える 1

0

次のような方法で、正しい順序で別のリストを作成できます。

// 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;}
    }
}
于 2013-04-27T15:57:43.127 に答える