[過去ログ] ふらっと C#,C♯,C#(初心者用) Part154 (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
44:  (スッップ Sdea-PHKB) 2022/02/28(月)09:39 ID:+7QZaSxQd(1) AAS
 OBJListを使いまわさずに新規のListを作る 
 Enumerable.OrderByとか 
45(1):  (アウアウウー Sa2f-n9nK) 2022/02/28(月)13:06 ID:UX0HcLa3a(1) AAS
 そういうのはforで後ろから回して、削除、挿入 
46(1):  (テテンテンテン MM86-g6h8) 2022/02/28(月)17:42 ID:XSUMuMfaM(1) AAS
 >>43 
 そもそもがなんで順番変えるな!って怒られるかわかる? 
  
 分かったら対応もわかるはず 
47(1):  (ワッチョイ 06e9-jC74) 2022/02/28(月)19:07 ID:Dbx5MQPW0(1) AAS
 >>46 
 foreach中に順番変えられたらforeachが成り立たないのだろうなとは思いました。 
 頂いたアドバイスからPを別のリストに移動してドッキングしても 
 邪道では無さそうなので、そうしようと考えています。 
48(2):  (ワッチョイ ca24-yy09) 2022/03/01(火)11:27 ID:Dq7cA1DN0(1/3) AAS
 それだけのために一時バッファとしてもう一個リスト作るのはスマートじゃない 
 Remove&先頭挿入をペアで行う場合は後方の順番は狂わないので原始的にforで回せばいい 
  
 for (int i = 0, end = obj_list.Count; i < end; ++i) { 
 var obj = obj_list[i]; 
 if (obj.Name != "P") continue; 
 obj_list.RemoveAt(i); 
 obj_list.Insert(0, obj); 
 } 
49:  (ワッチョイ ca24-yy09) 2022/03/01(火)11:38 ID:Dq7cA1DN0(2/3) AAS
 >>48 
 そういえばint i = 1からでよかったな 
50(1):  (ワッチョイ 8a01-k1AF) 2022/03/01(火)12:59 ID:haFp+aqn0(1) AAS
 >>48 
 RemoveAtもInsertもO(n)だから 
 そのやり方なら新規にリストを作るほういいんじゃない? 
51:  (スップ Sd8a-8W3/) 2022/03/01(火)13:00 ID:qybIiuxnd(1/2) AAS
 >>45が自分もいいきがするけど何も考えずにやると移動したPのデータの順番がおかしくなりそうにも思えたから 
 自分はPの移動用のリストを用意してもとのリストを後ろから参照して最後にもとのリストに挿入がいいかなと思った 
52:  (ラクッペペ MM86-cxam) 2022/03/01(火)13:03 ID:RNWoyucIM(1) AAS
 List.Sort が出てこないけどなんか欠点でもあるの? 
53:  (アウアウウー Sa2f-n9nK) 2022/03/01(火)13:14 ID:FuAp7249a(1/2) AAS
 新しくリストを作るって以上に処理が多くなる 
54:  (ワッチョイ ca24-yy09) 2022/03/01(火)13:31 ID:Dq7cA1DN0(3/3) AAS
 >>50 
 要素数がめちゃくちゃ多い場合はそうだな 
 RemoveAtで発生する後方要素の前方詰めが今回は完全に不要だから一回分多く無駄な処理が挟まってるからな 
 .NET5以上ならCollectionsMarshal.AsSpanを利用して 
 obj_span.Slice(0, i).CopyTo(obj_span.Slice(1, i)); 
 obj_span[0] = obj; 
 とかに変えればO(n)処理は1回だけで済むからどんなパターンでも新規List作成より早く済むと思うが 
55(1):  (アウアウウー Sa2f-n9nK) 2022/03/01(火)13:50 ID:FuAp7249a(2/2) AAS
 要素が少ないときは新しくリスト作る方がremove/insertよりも数倍速い 
 ただ新しくリスト作るのはメモリを倍食うから、要素数が多くなったら(物理メモリよりも多くなったら)どうだか 
56:  (ワッチョイ ff2f-65e0) 2022/03/01(火)14:23 ID:V9EqT+vw0(1) AAS
 つかそもそも、並べ替えたListそのものを保存する必要があるのかとか 
 初めから必要な順番で保存できないかとか考えたほうが良い気がする 
57:  (スップ Sd8a-8W3/) 2022/03/01(火)14:28 ID:qybIiuxnd(2/2) AAS
 そもそもでいえば並べ替えのAdd時点でPを前に入れたいってわかっていれば 
 それなりの実装もあるんじゃねと思ったりしているから 
 質問の内容だけだとやりかたなんて色々あるよね 
58(1):  (ワッチョイ ca79-OOjg) 2022/03/01(火)18:06 ID:fDW5QBJr0(1/3) AAS
 糞みたいな方法しか出てきてないけど普通に考えると 
 1) 元のリストからPを抜き出しつつ、Pだけ抜き出したリストを作る 
 2) Pだけのリストの後ろに元のリストをマージする 
 あとはList<>で気の利いた方法がないか調べる 
59:  (ワッチョイ 4f17-ibFl) 2022/03/01(火)18:38 ID:SjVwjYfg0(1) AAS
 >>58 
 ここまでで一番糞なのは案件満たしてないあんたやんけ 
 それだと「I,N,P,P」から「P,P,I,N,P,P」になってまうでw 
60:  (ワッチョイ 6b2d-jC74) 2022/03/01(火)18:55 ID:xQ0S3wJN0(1) AAS
 >>55 
 元のリストの中身(OBJクラスのインスタンス)をコピーせずに新しいリストで使いまわせば 
 メモリー消費の一時的な増加はあまり気にしなくて良い場合が多いんじゃないかな 
61(1):  (ワッチョイ ca79-OOjg) 2022/03/01(火)19:17 ID:fDW5QBJr0(2/3) AAS
 めんどくせえやっちゃこれでいいだろ 
 OBJList.Sort((a,b) => (a.Name != b.Name) ? (a.Name != "P") ? (b.Name != "P") ? 0 : 1 : -1 : 0); 
62:  (オイコラミネオ MMeb-g6h8) 2022/03/01(火)20:17 ID:lFABJG9JM(1/2) AAS
 >>61 
 これは初心者には呪文にしか見えないだろw 
63:  (オイコラミネオ MMeb-g6h8) 2022/03/01(火)20:18 ID:lFABJG9JM(2/2) AAS
 訂正 
 誰にも呪文にしか見えない 
64:  (ワッチョイ 6f5f-vePS) 2022/03/01(火)20:58 ID:pQFC2fuH0(1) AAS
 これでプルリク出されたらレビュイー殺してしまうかもしれん 
65:  (ワッチョイ ca79-OOjg) 2022/03/01(火)20:59 ID:fDW5QBJr0(3/3) AAS
 そういやListのソートは不安定だからNoをインデックスに見立てれば安定ソート 
 OBJList.Sort((a,b) => (a.Name != b.Name) ? (a.Name != "P") ? (b.Name != "P") ? (a.No - b.No) : 1 : -1 : (a.No - b.No)); 
 LINQのOrderByは元から安定ソート 
 OBJList = OBJList.OrderBy(a => a.Name != "P").ToList(); 
66(1):  (ワッチョイ 6f02-bukj) 2022/03/01(火)21:09 ID:gr6OEBT80(1/2) AAS
 var weight = new Dictionary() { { "P", 1 }, { "I", 2 }, { "N", 3 } }; 
 var result = OBJList.OrderBy( a => weight[ a.Name ] ).ToList(); 
 の方が好み。エラーチェックは無視。 
67(1):  (ワッチョイ ca01-lzB5) 2022/03/01(火)22:16 ID:FpudFrD40(1) AAS
 >>66 
 それ NIPP ⇒ PPIN になるんじゃね? 
68:  (ワッチョイ 8379-BANU) 2022/03/01(火)22:17 ID:BpvMrVad0(1) AAS
 ワンループで 
 P用参照リストと 
 それ以外参照リスト作って 
 最後にP用を前にしてドッキング 
69:  (ワッチョイ 6336-8W3/) 2022/03/01(火)22:42 ID:kklKOfnn0(1/2) AAS
 datagridviewの垂直スクロールバーについて教えてください。 
 datagridviewを作成した後、 
  
 DataGridViewRow[] list = new DataGridViewRow[50]; 
 (listの中身作成) 
 dataGridView1.Rows.AddRange(list); 
  
 のようにしてdataGridView1にデータを表示させようとすると縦スクロールバーが上手く表示されずフリーズ状態になってしまいます。 
 dataGridViewを作成した後に縦スクロールバーが出るまでdataGridView1.Rows.Addを繰り返して縦スクロールバーを出した後に 
 上記を実行した場合は問題なく表示されます。 
  
 縦スクロールバーを出すために無意味なデータをdataGridViewに表示させるといった不必要な処理を行いたくないのですが、 
 データを投入しなくても縦スクロールバーを出す方法、あるいは 
 dataGridView1.Rows.AddRange(list); 
 を実行してもフリーズしない方法はありますでしょうか? 
70:  (ワッチョイ 6f02-8W3/) 2022/03/01(火)22:53 ID:i/a33NyP0(1) AAS
 とりあえず片っ端からやってみたら 
 外部リンク:www.google.co.jp 
71:  (ワッチョイ 6336-8W3/) 2022/03/01(火)23:36 ID:kklKOfnn0(2/2) AAS
 ありがとうございます! 
 これでできました! 
  
 【C#】DataGridViewで編集不可やスクロールバーを常に表示する | NOARTS 
 外部リンク:noarts.net 
72(1):  (ワッチョイ 6f02-bukj) 2022/03/01(火)23:50 ID:gr6OEBT80(2/2) AAS
 >>67 
 あくまでやり方の一例。 
 問題があるなら自分で何とかしてくれ。 
73:  (ワッチョイ 8a01-k1AF) 2022/03/02(水)00:28 ID:MSZ3LlYF0(1/2) AAS
 AsSpan使ったらどうなるか興味あったからベンチしてみたら 
 1000件くらいだと一番高速だけど結局O(n^2)なので1~2万件でList<T>.Sortとかと逆転した 
 1万件程度なら余程最適化したい場合を除いてどれを選んでも性能的には問題なさそう 
  
 1. List<T>.Sort 
 2. Enumerable<T>.OrderBy 
 3. AsSpan + For Loop 
 4. RemoveAt + Insert + For Loop 
 5. Partition + Concat 
上下前次1-新書関写板覧索設栞歴
あと 929 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.014s