ソート処理

今回はC#のWPFでPointの座標データをソートするプログラム製作にポンコツ2人組が挑戦してみました。 Listにいくつかの座標データを追加して、下記のソート処理を実行しています。
1つ目のコードでは、OrderByとThenByを使用してX座標を第1優先で昇順に、Y座標を第2優先で昇順にソートしています。
その後でOrderByDescendingおよびThenByDescendingを使用してX座標を第1優先で降順に、Y座標を第2優先で降順にソートしています。
2つ目のコードはY座標を第1優先にして、1つ目と同様に昇順・降順のソートをしています。 C#初心者が制作したものなのでいろいろとおかしい部分が多いと思います。プログラムを流用する際は適宜修正してください。

※この記事は2023/09/12時点の情報です。

X座標を第1優先にした例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Point> pointList = new List<Point>
            {
                new Point(3, 2),
                new Point(1, 4),
                new Point(2, 2),
                new Point(3, 1),
                new Point(1, 3)
            };

            // X座標を第1優先、Y座標を第2優先で昇順にソート
            var sortedPoints = pointList.OrderBy(p => p.X).ThenBy(p => p.Y).ToList();

            Console.WriteLine("昇順ソート:");
            foreach (var point in sortedPoints)
            {
                Console.WriteLine($"X: {point.X}, Y: {point.Y}");
            }

            // 反対のソート (X座標を第1優先、Y座標を第2優先で降順にソート)
            var reverseSortedPoints = sortedPoints.OrderByDescending(p => p.X).ThenByDescending(p => p.Y).ToList();

            Console.WriteLine("\n反対のソート:");
            foreach (var point in reverseSortedPoints)
            {
                Console.WriteLine($"X: {point.X}, Y: {point.Y}");
            }
        }
    }
}

以下がこのプログラムの実行結果です。

昇順ソート:
X: 1, Y: 3
X: 1, Y: 4
X: 2, Y: 2
X: 3, Y: 1
X: 3, Y: 2

反対のソート:
X: 3, Y: 2
X: 3, Y: 1
X: 2, Y: 2
X: 1, Y: 4
X: 1, Y: 3

Y座標を第1優先にした例
このコードでは、まずY座標を第1優先、X座標を第2優先で昇順にソートした結果をascendingSortedPointsに格納し、 次にY座標を第1優先、X座標を第2優先で降順にソートした結果をdescendingSortedPointsに格納しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfSample
{
    /// 
    /// MainWindow.xaml の相互作用ロジック
    /// 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List pointList = new List
            {
                new Point(3, 2),
                new Point(1, 4),
                new Point(2, 2),
                new Point(3, 1),
                new Point(1, 3)
            };

            // Y座標を第1優先、X座標を第2優先で昇順にソート
            var ascendingSortedPoints = pointList.OrderBy(p => p.Y).ThenBy(p => p.X).ToList();

            Console.WriteLine("昇順ソート:");
            foreach (var point in ascendingSortedPoints)
            {
                Console.WriteLine($"X: {point.X}, Y: {point.Y}");
            }

            // Y座標を第1優先、X座標を第2優先で降順にソート
            var descendingSortedPoints = pointList.OrderByDescending(p => p.Y).ThenByDescending(p => p.X).ToList();

            Console.WriteLine("\n降順ソート:");
            foreach (var point in descendingSortedPoints)
            {
                Console.WriteLine($"X: {point.X}, Y: {point.Y}");
            }
        }
    }
}

以下がこのプログラムの実行結果です。

昇順ソート:
X: 3, Y: 1
X: 2, Y: 2
X: 3, Y: 2
X: 1, Y: 3
X: 1, Y: 4

降順ソート:
X: 1, Y: 4
X: 1, Y: 3
X: 3, Y: 2
X: 2, Y: 2
X: 3, Y: 1

配列のソート
このコードはPointではなく、オブジェクトを格納した配列のソート例です。 第1優先:x1の昇順、第2優先:y1の昇順のソートし、次に 第1優先:y1の降順、第2優先:x1の降順でソートします。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public class Sample
        {
            public int X1 { get; set; }
            public int Y1 { get; set; }
            public int X2 { get; set; }
            public int Y2 { get; set; }

            public Sample(int x1, int y1, int x2, int y2)
            {
                X1 = x1;
                Y1 = y1;
                X2 = x2;
                Y2 = y2;
            }
        }

        public MainWindow()
        {
            InitializeComponent();

            List<Sample> sampleList = new List<Sample>
            {
                new Sample(3, 2, 10, 12),
                new Sample(1, 4, 13, 11),
                new Sample(2, 2, 12, 10),
                new Sample(3, 1, 11, 12),
                new Sample(1, 3, 13, 12)
            };

            // ソート要件に従ってリストをソート
            sampleList.Sort((s1, s2) =>
            {
                if (s1.X1 == s2.X1)
                {
                    return s1.Y1.CompareTo(s2.Y1);
                }
                return s1.X1.CompareTo(s2.X1);
            });

            // ソートされたデータをコンソールに表示
            foreach (var sample in sampleList)
            {
                Console.WriteLine($"X1: {sample.X1}, Y1: {sample.Y1}, X2: {sample.X2}, Y2: {sample.Y2}");
            }

            Console.WriteLine("");

            List<Sample> sampleList2 = new List<Sample>
            {
                new Sample(3, 2, 10, 12),
                new Sample(1, 4, 13, 11),
                new Sample(2, 2, 12, 10),
                new Sample(3, 1, 11, 12),
                new Sample(1, 3, 13, 12)
            };

            // ソート要件に従ってリストをソート
            sampleList2.Sort((s1, s2) =>
            {
                if (s1.Y1 == s2.Y1)
                {
                    return s2.X1.CompareTo(s1.X1); // y1が同じ場合、x1を降順で比較
                }
                return s2.Y1.CompareTo(s1.Y1); // y1を降順で比較
            });

            // ソートされたデータをコンソールに表示
            foreach (var sample in sampleList2)
            {
                Console.WriteLine($"X1: {sample.X1}, Y1: {sample.Y1}, X2: {sample.X2}, Y2: {sample.Y2}");
            }
        }
    }
}

以下がこのプログラムの実行結果です。

X1: 1, Y1: 3, X2: 13, Y2: 12
X1: 1, Y1: 4, X2: 13, Y2: 11
X1: 2, Y1: 2, X2: 12, Y2: 10
X1: 3, Y1: 1, X2: 11, Y2: 12
X1: 3, Y1: 2, X2: 10, Y2: 12

X1: 1, Y1: 4, X2: 13, Y2: 11
X1: 1, Y1: 3, X2: 13, Y2: 12
X1: 3, Y1: 2, X2: 10, Y2: 12
X1: 2, Y1: 2, X2: 12, Y2: 10
X1: 3, Y1: 1, X2: 11, Y2: 12

管理人情報