ふらっと C#,C♯,C#(初心者用) Part133
■ このスレッドは過去ログ倉庫に格納されています
「どんなにくだらないC#プログラミングやVisual C#の使い方に関する質問でも誰かが優しくレスをしてくれるスレッド」です。
他のスレッドでは書き込めないような低レベルな質問、
質問者自身なんだか意味がよく分からない質問、
ググろうにもキーワードが分からないなど、勇気をもって書き込んでください。
内容に応じて他スレ・他板へ行くことを勧められることがあります。ご了承下さい。
なお、テンプレが読めない回答者は邪魔なので後述のC#相談室に移動して下さい。
C#に関係の無い話題や荒らしの相手や罵倒レスはやめてください
>>980を踏んだ人は新スレを建てて下さい。
>>980が無理な場合、話し合って新スレを建てる人を決めて下さい。
■前スレ
ふらっと C#,C♯,C#(初心者用) Part132
http://mevius.5ch.net/test/read.cgi/tech/1507543256/
■関連スレ
C#, C♯, C#相談室 Part95
http://mevius.5ch.net/test/read.cgi/tech/1508180530/
■コードを貼る場合は↓を使いましょう。
http://ideone.com/
https://dotnetfiddle.net/
■情報源https://msdn.microsoft.com/ja-jp/library/gg145045.aspx
https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/index
https://msdn.microsoft.com/en-us/library/gg145045.aspx
http://referencesource.microsoft.com/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:----: EXT was configured 俺嫌われすぎだろ
アスペルガー症候群だから仕方ないのか linqより何でもListにしないと心休まらない兄貴の方が重症かもな linqだからで許されてるクソコード延々貼り付けたガイジはさっさと死ねよ LINQが良いか悪いかは別にしてLINQを必要以上に毛嫌いする奴って頭悪いだけだろ。 >>439
今回のは普通に書いた方が綺麗だったよね? ここ数日の有り様は何なんだろう
C#養護学校の卒業式でもあったのかね 必要以上にってのが言いたかった。
実用性は別としてリスト操作系関数でスラスラ書ける奴にコンプでもあるのかって思っちゃう >>443
え?
そんなの気にしたことないや
プログラムなんて組めるようになったらそこでスキルレベルマックスだろ あとは
設計書記述スキルを上げるか
見積り書記述スキルを上げるか
議事録作成スキルを上げるか
した方がナンボか実りがあるよ >>440
レスいくつも書き込むくらいならそのコード提示したらいいのに >>447
別に俺そここだわらんよ
興味ねーし
お前にも 興味ねーならゴミだのクソだのほざいてんじゃねーよw >>449
クソコードを嬉々として貼られるのは見逃せないな
荒らしと変わんねーし どれだけ偉そうな主張があるのかと思えば
貼ってあるのはクソコードばかり
linq貼ってるやつ目障りだから死ねよ
普通に組んだ方が綺麗なコードなら持ってくんなよ
だっせ おまえの価値基準で判断すんなw
コンプ感じてるだけw これ以上はLINQスレでやれと言おうとしたらもう落ちているのね >>452
いいじゃん
便所の落書きなんだし
俺が書くスペースもあんだろ
誰でもかける処理わざわざ複雑にして
悦にいってるマヌケなPGみて
安心感を得られるセラピー効果もある どっちかっていうとアプリを作れないアホだな
まあ、コードで何か主張したいならGitHubでもやればいいのに
こんな便所でしか主張できないなら
クズどものlinqライフもここでしめーだろ ウハwwwwww
書けない奴が批判の図wwww
権利すらなしwwwwwww >>458
クソコード貼っていい気になってるの?
アドバイスしてあげるけど
滅茶苦茶レベル低いよ stringは参照型だから既定値はnullということで合ってるよね? >>466
既定値はnullだけどstringはイミュータブル型 >>466
stringは参照型で規定値はnull WPFじゃなくてWindowsForms内で簡単な3D描画したいんですが
どういう風がいいでしょうか。
とりあえず箱を線で描くだけなんですが。
・DrawLineみたいなので始点終点を3次元(X,Y,Z)で指定し描画
・視点の位置(X,Y,Z)と向きを指定して表示
って風な感じが希望なんですが・・・・ DrawLine の Point型 って X,Y しかないじゃないですか。
X,Y,Z で指定できる DrawLine がないのかと カメラ固定でいいんだろ?
ZがXYのどこになるかは簡単な計算で出せる
紙に気に入った角度の3軸を書いて見ればいい >>471
カメラの視線方向をZ軸、カメラから1000mm先のカメラの視線に垂直な平面上の1000mmの
線分がモニター上に1000mmで表示されるモデルを採用、3D、2Dともに同じ単位系(例えばmm)
を使用する条件なら、3D空間上の点(X, Y, Z)を2D上の点(x, y)に写像するには、
(x, y) = (X/Z, Y/Z)
でいいと思う。知らんけど
2DグラフィックのY軸が下向きなのを考慮するならyはもちろん-1倍する 描画面の中心を原点にする変換も必要かw
こっちはGraphicsの組み込みの機能でできるけど そんな面倒なことしなくても
カメラ固定ならXYに足すだけでいいじゃん
Zが1ならXYに0.5ずつ足すみたいのでいいよ
Zが2ならXYに1ずつ足す
Zが3ならXYに1.5ずつ足す
みたいな >>469
URLが何故か張れないんだが
C#3D立方体ワイヤーフレーム (第1回) for VS2013 Express
でググって見つかるところが参考になる
ライブラリを期待しているのならC++で探すしかないだろうな
DLLになっていればC#からでも使えるから いくらなんでもopenGLライブラリはwinforms用ぐらいあると思う
windows forms openglでググれ 時間, 名前, テスト回数
2017/1/1, A氏, 3
2017/1/1, A氏, 4
2017/1/1, B氏, 1
2017/1/1, B氏, 2
2017/2/1, A氏, 1
2017/2/1, A氏, 2
2017/2/1, B氏, 1
2017/2/1, B氏, 2
2017/3/1, A氏, 1
2017/3/1, A氏, 2
2017/3/1, A氏, 3
↑のようなデータがある場合
↓のように名前ごとに最新の時間のデータを取得したい。
2017/3/1, A氏, 1
2017/3/1, A氏, 2
2017/3/1, A氏, 3
2017/2/1, B氏, 1
2017/2/1, B氏, 2 >>482
↓のような感じで取れるとは思いますが
実際のデータでは時間も名前も複数あるのでLINQで一発で取れる書き方はないでしょうか?
public class Test
{
public DateTime 時間 { get; set; }
public string 名前 { get; set; }
public int テスト回数 { get; set; }
}
List<Test> ListTest = new ListTest ();
var List1 = ListTest.Where(x=>x.名前 == "A氏" & x.時間 = 2017/3/1).ToList();
var List2 = ListTest.Where(x=>x.名前 == "B氏" & x.時間 = 2017/2/1).ToList();
List3.add(List1);
List3.add(List2); そんなこといわずに優しいレスくれよ
友の会ってどこなの? list.GroupBy(item=>item.名前).Select(group=>group.Max(item=>item.日時.Ticks)).ToList<Test>() >>487
レスありがとうございます。
Ticks使ったことないので参考になりました。
ありがとうございます。 ListTest.GroupBy(item => item.名前).Select(group => group.Aggregate((max, item) => item.時間 > max.時間 ? item : max)).ToList() DateTimeオブジェクトはそれ自体に大小関係演算子使えるしな 並びの下の方が同じ日付でも最新なの?
まあ、そういうデータよくあるけど SQLだとドヤ顔でExistsしてるブログがたくさん出るやつだな 下のやつを最新にしたいなら>=にすればいいのかな
順番通りの保障ないかもしれないけど ienumerbleだからだめか
最初の段階でインデックスとペアにするとか これだけで各々の最新のデータが取れるはず。
ListTest.GroupBy(item => item.名前).Select(group => group.OrderBy(item => item.時間).Last()).ToList()
・GroupBy
Elements in a grouping are yielded in the order that the elements that produced them appear in source.
https://msdn.microsoft.com/ja-jp/library/bb534304(v=vs.110).aspx
・OrderBy
キーに従って昇順のシーケンスの要素を並べ替えます。
このメソッドは、安定した並べ替えを実行します。つまり、2 つの要素のキーが等しい場合は、要素の順序が保持されます。
https://msdn.microsoft.com/ja-jp/library/bb534966(v=vs.110).aspx
元データの並び順で下にあるほうのが優先されてるのをはっきりとわかるように書きたかったらかなり長いけどこうかな?w
ListTest.Select((item, index) => { Item = item, Index = index } ).GroupBy(pair => pair.Item.名前).Select(group => group.GroupBy(pair => pair.Item.時間).OrderBy(innerGroup => innerGroup.Key).Last().OrderBy(pair => pair.Index).Last().Item) LINQ使わなかったらこうか?
int indexOfSame名前(Test item, List<Test> list)
{
for(var i=0;list.Count;i++)
if(list[i].名前==item.名前){
foundIndex=i;
return i;
}
}
return -1;
}
List<Test> extractLatestData(List<Test> list)
{
var result=new List<Test>();
foreach(var item in list){
var foundIndex=indexOfSame名前(item, result);
if(foundIndex>=0){
if(item.時間>=result[foundIndex].時間){
result[foundIndex]=item;
}
}else{
result.Add(item);
}
}
return result;
}
var result= extractLatestData(ListTest);
LINQ使えばこう?
var result=ListTest.GroupBy(item => item.名前).Select(group => group.OrderBy(item => item.時間).Last()).ToList(); 横に長くて拒否反応出るのも解らないでは無いんだが
読む時は愚直に左から読んでいくだけだし、PowerShell使ってると日常茶飯事だしな…… >>504
じゃあ、全コード一行でいいじゃん
左から読んでいくだけだろ? foreach~~
result.Add(latestDataOf(リスト, 名前))
とかのほうがいい? これだとおかしいか
foreachであらかじめリストから抽出しておいた名前の種類の一覧とかを与えないとあれか 最新取る頻度が高いなら最新テーブルと履歴テーブルを分けてほしい みんなって推敲してるの?
真面目だな
俺もこれからはそうするかもしれん 真面目に考えるとデータベースに更新分Insertしてからあらかじめ作ってあるビューをSelectするだけ
GroupBYや集計はDBでやった方が楽だしこっちでは表示件数や順序くらいしかいじらない
データベースといってもローカル鯖や組み込みもある、適材適所 sources
.GroupBy(s => new { 名前, テスト回数 })
.Select(g => new {
g.Key.名前,
g.Key.テスト回数,
時間 = g.Max(s => s.時間)
});
悩むところねえなぁ ListTest.GroupBy(item => item.名前).Select(group => group.OrderBy(item => item.時間).Last()).ToList()
ワシのが1番じゃろ。 よくみたら仕様ちゃうやん自分…
src.GroupBy(s => s.名前)
.SelectMany(g => g.Where(t => t.時間 == g.Max(u => u.時間));
これが王道の正解な こっちのが速いかな
sec.ToLookup(s => s.名前)
.Select(g => new { g, m = g.Max(t => t.時間)
.SelectMany(p => p.g.Where(u => u.時間 == p.m); そういやラムダ式の中の命名は超シンプルでいいんだったな。
>>518 最大値を探すためにループ、その値を持ち主をまた探すためにループってなんかキモくね?それが王道なのか。 >>482
まず時間と名前でグループ化
時間, 名前, テスト回数
2017/1/1, A氏, 3,4
2017/1/1, B氏, 1,2
2017/2/1, A氏, 1,2
2017/2/1, B氏, 1,2
2017/3/1, A氏, 1,2,3
あとは日付けでソートして名前でDistinctするかな >>520
ループ?
SelectManyはSQLで言えば結合みたいなもの
LinqのJoinだとこんな感じかな
src.GroupBy(s => s.名前)
.Join(src,
g => new { 名前 = g.Key, 時間 = g.Max(t => t.時間) },
u => new { u.名前, u.時間 },
(g, u) => u);
SelectManyの方がわかりやすいな Maxを探すためにループ、その持ち主また探すためにWhereでループ max ← 持ち主
こういう方向のリンクなら、max を探してから、持ち主も探さなきゃいけないけど、
逆方向のリンクなら、すぐ 名前、日付で降順ソートして名前ごとの最新取るだけでなげーな >>525
それ結局最後まで舐めないと全ての名前が分からないから何の意味もないぞ LINQって実は裏側でforeachで回してるってホント? 例えば、100個の中から、1個を探すのは、全(線形)探索 O(n) しかできない
全データにインデックス・ハッシュがついていれば、O(1)だが、
ソートするには、全探索する必要がある
DB みたいに、B-tree でソートされているのなら、O(log n)
「アルゴリズムと計算量」を勉強して >>529
すればいいじゃん
何がしたいの?
速度アップしたいの? こんなにレスが付いてるとは思わなかった。
無事満足いく結果がとれるようになりました。
試したことないのもあって勉強になりましたありがとうございます。 ■ このスレッドは過去ログ倉庫に格納されています