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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

3859閲覧

DictionaryをValueでソートし、Keyをそのソート順に取得したい

MOTOMUR

総合スコア195

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/06/02 13:20

編集2020/06/02 15:09

経緯。
RPGの戦闘で素早さ順にソートしたい
味方の情報はAllyMemberStatus[] AllyMemberStatusArray、敵の情報はEnemyStatus[] EnemyStatusArrayで扱ってる。

クラスの中身が同じならListに全部入れてソートしてあげればいいのですが、
AllyMemberStatusとEnemyStatusは基本ステータス以外はそれぞれ違う要素を持っている(例:獲得経験値や、敵が落とす経験値などの要素)

やりたいこと

素早さ順がソートできればいい。
「配列のKey」とSPD(素早さ)をListに入れてdictionaryにいれて、ソートし、SPD順にKeyを配列に代入することで行動順を管理したいのですが、
どのようにListに入れてソートすればいいか混乱したので質問させていただきました。

追記

C#

1var SPD = new Dictionary<int, int>() 2 { 3 {0, 5}, (配列のKey,それぞれのスピード) 4 {1, 2}, 5 {2, 4} 6 ・・・・・・ 7 }

ソートされたDictionaryの中身をkeyじゃなく、順番に取ってくるにはどうしたらいいかわかりませんでした。(下記コードのSPD[0]は5が帰ってきてしまう。)
SPDディクショナリーソート後の一つ目から最後までのKeyを順番に取得する方法を知りたいです。
また、Dictionaryのソートも下記サイトを見ましたがいまいちわかりませんでした。

https://takachan.hatenablog.com/entry/2018/04/02/232452

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

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

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

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

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

guest

回答3

0

素早さ順がソートできればいい。

Dictionaryを使う必要がわからないので、抽象クラスを継承させて、まとめてコレクションで管理したら良いと思います。

サンプルコードを提示します。

C#

1using System; 2using System.Linq; 3using System.Collections.Generic; 4 5public abstract class Status{ 6 public int SPD; 7} 8 9public class AllyMemberStatus : Status{ 10} 11 12public class EnemyStatus : Status{ 13} 14 15public class Program{ 16 static void Main(string[] args) 17 { 18 var allyMemberStatuses = new[] { 19 new AllyMemberStatus{SPD = 5}, 20 new AllyMemberStatus{SPD = 2}, 21 new AllyMemberStatus{SPD = 4}, 22 }; 23 var enemyStatuses = new[] { 24 new EnemyStatus {SPD = 7}, 25 new EnemyStatus {SPD = 9}, 26 new EnemyStatus {SPD = 1}, 27 }; 28 var statuses = new List<Status>(); 29 statuses.AddRange(allyMemberStatuses); 30 statuses.AddRange(enemyStatuses); 31 32 foreach(var status in statuses.OrderBy(x => x.SPD)){ 33 Console.WriteLine(status.SPD); 34 } 35 } 36}

statusesAddRangeで2回コレクションをまとめて追加していますが、そうする必要もなく、下記のように保持しておくことも可能です。

C#

1var statuses = new List<Status>{ 2 new AllyMemberStatus{SPD = 5}, 3 new AllyMemberStatus{SPD = 2}, 4 new AllyMemberStatus{SPD = 4}, 5 new EnemyStatus{SPD = 7}, 6 new EnemyStatus{SPD = 9}, 7 new EnemyStatus{SPD = 1} 8};

投稿2020/06/03 06:00

編集2020/06/03 06:04
BluOxy

総合スコア2663

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

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

MOTOMUR

2020/06/04 10:57

生成したオブジェクトが元の配列の並びで結びついているため、元の配列の並び替えは避けたかったため、 配列へのアクセスKeyを素早さで並び替えたい。→2つの要素の保存ができるのは→Dictionaryでした。
BluOxy

2020/06/04 15:21

行動順がほしいのですね。把握していませんでした。であれば、下記のようにSelectを足せば取得できます。 statuses.OrderBy(x => x.SPD).Select((x,i) => new {Index = i, Status = x})
guest

0

ベストアンサー

Unityでできるかわからないのですが、

C#

1 Dictionary<int, int> tmp = new Dictionary<int, int>(); 2 tmp.Add(0, 5); 3 tmp.Add(1, 1); 4 tmp.Add(2, 3); 5 tmp.Add(3, 2); 6 tmp.Add(4, 4); 7 tmp = tmp.OrderBy(v => v.Value).ToDictionary(key => key.Key, val => val.Value);//逆の場合はOrderByDescending

投稿2020/06/02 16:07

Hey_CH

総合スコア437

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

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

MOTOMUR

2020/06/04 10:57

こちらのコードを参考にやってみたら、できました。ありがとうございます。
guest

0

「敵味方を区別する変数と、敵味方それぞれの配列の特定要素を示すインデックスと、素早さの値」を持つリスト(でも配列でもソート可能ならok)を用意して、素早さの値でソートすりゃいいんじゃない。

投稿2020/06/02 14:26

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問