質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

Q&A

解決済

1回答

2565閲覧

C#で連想配列の並び順を、別配列の並び順に合わせて並び替える方法はありますか?

pip

総合スコア19

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

0グッド

0クリップ

投稿2018/09/29 23:21

連想配列を特定のKeyでソートをする方法を探しています。
また、並び順は、昇順(降順)ではなく、別途用意した配列の順番に準拠させたいです。

PHPの場合はusortを使ってソート時に関数を実行し、その結果でソートする方法を思いつきます。
C#で同様の事をしたい場合は、実現する方法はありますか?

Userという独自のクラスを用意し、Indexをキーにします。
並び順は、OrderIndexsという配列を用意し、それに合わせて連想配列を並び替えます。

Userクラス

cs

1public class User { 2 public int Index { get; private set; } // 番号 3 public string Name { get; private set; } // 名前 4 5 public User( 6 int index, 7 string name, 8 ) 9 { 10 Index = index; 11 Name = name; 12 } 13}

処理クラス

中途半端な状態で恐縮ですが、processという関数内でソートをしようと考えました。
ただ、処理の書き方がわからず、止まってしまいました。

cs

1public class Controller { 2 3 User[] Users = new User[]{ 4 new User(1, 'ユーザー1'); 5 new User(2, 'ユーザー2'); 6 new User(3, 'ユーザー3'); 7 new User(4, 'ユーザー4'); 8 new User(5, 'ユーザー5'); 9 }; 10 11 // ソートする順番を指定した配列 12 int[] OrderIndexs = {5, 3, 2, 4 ,1} 13 14 public process(){ 15 16 // OrderIndexの配列順に合わせてUsersを並び替えたいのですが、その方法がわかりません。 17 // ソートの条件をスクリプトで指定する方法があれば教えていただきたいです。 18 Users.Sort(CompareByIndex()) ? 19 20 } 21 22 // ソート自体のスクリプト 23 // 引数のUserのIndexを元に、OrderIndexsからIndexOfで順番を取得。 24 // 比較して順番を変える 25 private static int CompareByIndex(User a, User b) 26 { 27 return Array.IndexOf(OrderIndexs, a.Index) < Array.IndexOf(OrderIndexs, b.Index); 28 } 29} 30

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

次のようにすればできます。

C#

1using System; 2using System.Collections.Generic; 3using System.Diagnostics; 4using System.Linq; 5 6namespace ConsoleApp1 7{ 8 class Program 9 { 10 static void Main(string[] args) 11 { 12 var controller = new Controller(); 13 controller.PrintDebug("ソート前"); 14 controller.process(); 15 controller.PrintDebug("ソート後"); 16 Console.ReadKey(); 17 } 18 } 19 20 public class User 21 { 22 public int Index { get; private set; } // 番号 23 public string Name { get; private set; } // 名前 24 25 public User( 26 int index, 27 string name 28 ) 29 { 30 Index = index; 31 Name = name; 32 } 33 } 34 35 public class Controller 36 { 37 38 User[] Users = new[]{ 39 new User(1, "ユーザー1"), 40 new User(2, "ユーザー2"), 41 new User(3, "ユーザー3"), 42 new User(4, "ユーザー4"), 43 new User(5, "ユーザー5"), 44 }; 45 46 // ソートする順番を指定した配列 47 int[] OrderIndexs = { 5, 3, 2, 4, 1 }; 48 49 public void process() 50 { 51 var dict = new Dictionary<int, int>(); 52 for (int i = 0; i < OrderIndexs.Length; i++) 53 { 54 dict.Add(OrderIndexs[i], i); 55 } 56 Users = Users.OrderBy(a => dict[a.Index]).ToArray(); 57 } 58 59 [Conditional("DEBUG")] 60 public void PrintDebug(string message) 61 { 62 Console.WriteLine(message); 63 foreach (var user in Users) 64 { 65 Console.WriteLine($"Index: {user.Index}, Name: {user.Name}"); 66 } 67 } 68 } 69}

投稿2018/09/29 23:47

Zuishin

総合スコア28656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pip

2018/09/29 23:53 編集

早々にご回答いただきありがとうございます! 一度、Dictionary型にすれば実現できるのですね。 試してみます。
Zuishin

2018/09/29 23:57 編集

しなくてもできます。 高速化のためにキャッシュしているだけです。 問題はそこではなく、OrderBy() と Comparison の使い方です。 詳細はこの二つのキーワードで自分で調べてみてください。
pip

2018/09/30 00:01

ご指摘ありがとうございます。 要領を得ておらず失礼しました。
Zuishin

2018/09/30 00:11

余談ですが、Dictionary を使わない場合はこうなります。 OrderIndexes の要素数がこの程度なら大差ありませんが、数が増えると速度に差が出てきます。 public void process() { Users = Users.OrderBy(a => Array.IndexOf(OrderIndexs, a.Index)).ToArray(); }
pip

2018/09/30 00:16

度々ありがとうございます! 私が、最初に想像していたものはこちらに近いかもしれません。 ただ、処理速度に影響するのですね。 先ほどのキャッシュの件も含めて、勉強させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問