リストの要素を並べ替える

リストの要素の並べ替えについて考えます。たとえば、リスト [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}
        }


リストを並べ替える部分ですが、

となっています。

    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 のクエリ構文でどう書けばいいか、わかりませんでした、、、