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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

4回答

235閲覧

リスト状のものを昇順並び替えするには?

steam

総合スコア12

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

1クリップ

投稿2019/07/10 01:13

前提・実現したいこと

windows form applicationの
listBox1のデータを昇順並び替えしたいです。

1|サンプル1
3|サンプル3
2|サンプル2

簡単に書くとこんな感じのデータ(文字型)を
区切り文字「|」の前部分の値をキーにして
昇順に並び替えてlistbox1に戻したいです。

1|サンプル1
2|サンプル2
3|サンプル3

該当のソースコード

//リスト宣言 List<string> lt = new List<string>(); //昇順でリストに追加 for (int i = 0; i < listBox1.Items.Count; i++) { int n_num = int.Parse(listBox1.Items[i].ToString().Split('|')[0]); if (lt.Count == 0) { lt.Add(listBox1.Items[i].ToString()); } else { for (int q = lt.Count; q >0; q--) { int o_num = int.Parse(lt[q - 1].ToString().Split('|')[0]); if (n_num > o_num) { lt.Insert(q, listBox1.Items[i].ToString()); break; } else { if (q == 1) { lt.Insert(0, listBox1.Items[i].ToString()); } } } } } //リストボックスに戻す listBox1.Items.Clear(); listBox1.Items.AddRange(lt.ToArray());

試したこと

一応動作はするのですが、
もっと良い方法を知りたいと思い
質問させていただきました。
よろしくお願いいたします。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/07/10 01:17

> もっと良い方法を知りたい 「もっと良い」が何を指すのかわからないので、具体的にお願いします。
退会済みユーザー

退会済みユーザー

2019/07/10 02:31

質問者さんの期待通り動作して問題がなければそれで良いと思いますけど・・・ どこに問題がある、もしくは気に入らないのでしょうか? それを書いてくれないと適切な答えは得にくいと思いますけど。
退会済みユーザー

退会済みユーザー

2019/07/10 02:58

| の左側の数字は 0 ~ 9 の範囲なのか、10 以上もあるかとかで話が変わってきますが、そこのところはどうなのですか?
guest

回答4

0

こんな感じでどうでしょう?

C#

1var sortedItems = listBox1.Items.AsEnumerable<string>().OrderBy(item => item.Split('|')[0]).ToArray(); 2listBox1.Items.Clear(); 3listBox1.Items.AddRange(sortedItems); 4 5public static class CollectionsExtends 6{ 7 public static IEnumerable<T> AsEnumerable<T>(this System.Collections.IEnumerable collection) 8 { 9 foreach (var e in collection) yield return (T)e; 10 } 11}

投稿2019/07/10 01:45

ku__ra__ge

総合スコア4524

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

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

0

Linq使えばもっと簡潔に書けます。

C#

1var sortedItems = listBox1.Items 2 .Cast<string>() 3 .Select( x => new { Index = int.Parse( x.Split( '|' )[0] ), Text = x } ) 4 .OrderBy( x => x.Index ) 5 .Select( x => x.Text ) 6 .ToArray(); 7 8//リストボックスに戻す 9listBox1.Items.Clear(); 10listBox1.Items.AddRange( sortedItems );

投稿2019/07/10 05:17

draq

総合スコア2573

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

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

0

提示されたコードとほとんど同じだけど,ソート作業をListにやってもらう.

var list = new List< Tuple<int,string> >(); for( int i=0; i<listBox1.Items.Count; ++i ) { var ItemStr = listBox1.Items[i].ToString(); list.Add( new Tuple<int,string>( int.Parse(ItemStr.Split('|')[0]), ItemStr ) ); } list.Sort(); listBox1.Items.Clear(); foreach( var T in list ){ listBox1.Items.Add( T.Item2 ); }

投稿2019/07/10 01:33

fana

総合スコア11658

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

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

0

中の値が数値や時間でしたらCompareでよろしいかと

投稿2019/07/10 01:27

mo-ri

総合スコア35

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問