リストの要素の並べ替えについて考えます。たとえば、リスト [0, 1, 2, 3, 4] があり、
- 0 を 4 の前に移動
- 1 を 3 の前に移動
を実施し、結果として [2, 1, 3, 0, 4] のように並べ替えたいとします。
リストの Remove や Insert で並べ替えるのは大変なので、並べ替える順序を指定してソートするようにしてみました。プログラム言語は VB.NET です。
最初に、もとのリストを定義します。
Dim originalList As New List(Of String) From { "0", "1", "2", "3", "4" }
次に、並べ替える順序を指定するディクショナリを定義します。キーはリストのインデックス、値は並べ替える順序です。
Dim indexToOrderDic As New Dictionary(Of Integer, Double) From { {0, 3.5}, ' 0 は 4 の前に移動 {1, 2.5}, ' 1 は 3 の前に移動 {2, 2.0}, {3, 3.0}, {4, 4.0} }
リストを並べ替える部分ですが、
- Enumerable.Range (Enumerable.Range(Int32, Int32) メソッド (System.Linq) | Microsoft Learn) でインデックスを作成し、
- Enumerable.Zip (Enumerable.Zip メソッド (System.Linq) | Microsoft Learn) でもとのリストと組み合わせ、
- もとのリストの要素を "s"、インデックスからディクショナリで取得した並べ替え順序を "order" とし、
- それらを "order" の順でソートし、
- ソートされたリストの要素 "s" を取り出す。
となっています。
Dim index As IEnumerable(Of Integer) = Enumerable.Range(0, originalList.Count) Dim movedList As IEnumerable(Of String) = From item In Enumerable.Zip(originalList, index) Select s = item.First, order = indexToOrderDic(item.Second) Order By order Select s
要素に加えてインデックスが追加された Select (
Enumerable.Select メソッド (System.Linq) | Microsoft Learn) を使いたかったが、VB.NET のクエリ構文でどう書けばいいか、わかりませんでした、、、