[過去ログ] ふらっと C#,C♯,C#(初心者用) Part154 (1002レス)
1-

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
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
74: (ワッチョイ 8a01-k1AF) 2022/03/02(水)00:34 ID:MSZ3LlYF0(2/2) AAS
ところで
Span<T>もしくはIEnumerable<T>のどちらかを受け取るジェネリックな関数って定義できる?
75: (ワッチョイ 6f02-8W3/) 2022/03/02(水)01:42 ID:O26kNIml0(1/2) AAS
そりゃ出来るやろ
LINQがおもっくそそれだし
76
(1): (ワッチョイ ca01-+tM1) 2022/03/02(水)05:50 ID:+cCq037X0(1/3) AAS
>>72
いや、おかしいやり方示されても…
1-
あと 926 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ

ぬこの手 ぬこTOP 0.030s