
現在、C#とLINQを勉強している初学者です。
簡単な辞書のサンプルを作成に挑戦していますが、以下の事象で詰まってしまいました。
ご指南、コメントいただければ幸いです。。。
実現したいこと
単語のリストをLINQを用いて、「あ、い、う、......、ん、A、B、......、W」の優先順位で順番に並び替えたいです。
理想) ・並び替え前 「こたつ」「CD」「うさぎ」「ゆき」「TV」 ・並び替え後 「うさぎ」「こたつ」「ゆき」「CD」「TV」
今できていること
LINQのOrderByを用いて並び替えを行うと、「A、B、......、W、あ、い、う、......、ん」の優先順位で並び替えを行ってくれます。
現状) ・並び替え前 「こたつ」「CD」「うさぎ」「ゆき」「TV」 ・並び替え後 「CD」「TV」「うさぎ」「こたつ」「ゆき」
ソースコード
C#
1class Tango{ 2 public string Moji; 3 public string Yomi; 4} 5 6List<Tango> items = ... // 単語の初期化 7items = items.OrderBy(o => o.Yomi).ToList();

質問に CD とか TV とか書いてありますが、それらの文字列は全てアルファベットだけなのですか?
追記ありがとうございます。「TVかめら」「みにALBUM」といった複合型もあります。

それだと何ともならない、少なくとも一筋縄ではいかないと思います。ちょっとお付き合いしかねますので、お役に立てずすみませんが、他の方の回答をお待ちください。
出現する「文字」は「あ、い、う、......、ん、A、B、......、W」のみでしょうか。
戦略としては chatanisota さんの回答のように IComparer<string> を作ることになりますが、Comparer<T> というクラスがあるので、そこから派生させるのが良いでしょう。
あるいは派生させず Create メソッドからオブジェクトを作成することもできます。
文字列同士の比較では目的のものはないので、自分で比較メソッドを作る必要があります。
Enumerable.Zip<char> を使えば、短い方の文字列に合わせて文字毎の比較ができますので、これで行い、大小の差が出なかった場合に文字数の短い方を小さいと判定すれば良いと思います。
文字列同士の比較から呼び出される文字同士の比較ですが、ひらがなとアルファベットの違いをどう求めるかは、どのような文字が許されるのかによって多少戦略が変わってきますが、この質問のみから判断するなら、Char.IsAscii メソッドを使えば良いと思います。
スイッチ式が使えるのであれば、(char a, char b) => (Char.IsAscii(a), Char.IsAscii(b)) switch { (false, false) or (true, true) => a - b, (false, true) => -1, (true, false) => 1 } のように文字同士の比較ができます。

回答4件
あなたの回答
tips
プレビュー