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

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

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

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

0回答

1053閲覧

List<string>のSortの際にオリジナルソート順を指定したい

galmacher

総合スコア37

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

LINQ

LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2019/06/03 13:43

編集2019/06/03 13:44

stringでH,O,G,Eという文字列が格納されたList<string>があるとします。
その際に、あるケースでは「H,O,G,E」、別のケースでは「O,H,G,E」、
はたまた別のケースでは「E,H,O,G」…
という風に状況に応じてソート順を変えたいと思います。

一旦、以下のようなコードを書いて実現できました。

public class StringComparer : IComparer<string> { private Dictionary<string, int> hogeDic; public StringComparer (Dictionary<string, int> dic) { hogeDic = dic; } public int Compare(string x, string y) { return hogeDic[x].CompareTo(hogeDic[y]); } } class Program { static void Main(string[] args) { var list1 = new List<tring>() { "H", "O", "G", "E". }; var sortDic = new Dictionary<string, int>() { ["A"] = 1, ["B"] = 2, ["C"] = 3, } list1.Sort(new StringComparer(sortDic)); list1.ForEach(x => Console.WriteLine(x)); } }

動くので問題ないといえば問題ないのですが、
なんとなく、もっとうまい方法がありそうな気がしています。
(サンプルコードを探しても、dictionaryを外から与えているコードはなかなか無かったため、「変なやり方」になっているのではないかという不安もあり…。)

何か他に良い方法はございませんでしょうか。

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

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

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

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

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

Zuishin

2019/06/03 13:46

並び順に特にルールが無いならそのような方法しかないと思います。 何も特別な法則はないんですか?
galmacher

2019/06/03 13:51

ありがとうございます。 アルファベットの昇順、降順といった特別な法則はございません。
Zuishin

2019/06/03 14:01 編集

法則が無いのであれば順序を指定してやる他ありません。 Dictionary の作り方に関しては次のようにできます。 new[] { "E", "H", "O", "G" }.Select((element, index) => (element, index)).ToDictionary(a => a.element, a => a.index); これで E, H, O, G の順に並びます。 index と element が逆だったので修正しました。
papinianus

2019/06/03 22:38

Qに対する回答ではないのでこちらに。 探して出てこないのは、この方法だと辞書にあるものしかソートできない(例外を使っても辞書外のものは全くソートがきかない)のと、プリミティブ型(string)だけで何とかしようとすることがあまりない(実用的な局面では)、DBが裏にいると表示値と内部値が違ってDB側でソートが効くといったあたりではないですかね?
hihijiji

2019/06/04 04:40

ソートが必要なら、クラス設計の粒度をソートに必要な状態を持てるまで掘り下げることを推奨します。
galmacher

2019/06/05 13:06

> Zuishin様 ご回答ありがとうございます。 やはり指定してやるしかないのですね。 Dictionaryの生成方法、ありがとうございます。 >papinianus様 検索で出てこない理由も含めてわかりました。ありがとうございます。 >hihijiji様 ご指摘いただいた内容心がけるようにいたします。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問