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

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

新規登録して質問してみよう
ただいま回答率
85.47%
.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

3回答

7498閲覧

これは凄いと思ったコードを教えてください!

ranran

総合スコア85

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

1グッド

5クリップ

投稿2015/02/19 15:55

お世話になります。

現在黙々と.NET Frameworkを勉強しておりますが、
日に日に理解できなかったことが分かるようになります。

今まで何でこんな難しく書いてるんだ!
とイライラしたことが多々ありますが、それすらも楽しめます。

以下本文。

スレッドについて検索してる祭、コールバックの使い方を目にする機会がありました。
コールバックを使うことでコードが見やすくきれいになっており感動しました。

引用:CodeZine
URL:https://codezine.jp/article/detail/139?p=3
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Class ThreadInfo
'スレッドが結果を返すためのコールバックデリゲート
Delegate Sub MyThreadCallback(ByVal returnValue As Integer)
Private callbackDelegate As MyThreadCallback
'スレッドに渡す値
Public SleepTime As Integer

'インストラクタ Public Sub New(ByVal stime As Integer, _ ByVal callback As MyThreadCallback) Me.SleepTime = stime Me.callbackDelegate = callback End Sub '別スレッドで実行するメソッド Public Sub MyThreadMethod() 'sleepTimeミリ秒停止する System.Threading.Thread.Sleep(Me.SleepTime) 'コールバックデリゲートを実行して結果を返す If Not (Me.callbackDelegate Is Nothing) Then Me.callbackDelegate(System.Environment.TickCount) End If End Sub

End Class

Class MainClass
'エントリポイント
Public Shared Sub Main()
'ThreadInfoオブジェクトの作成
'スレッドにデータを渡す
Dim info As New ThreadInfo(1000, _
New ThreadInfo.MyThreadCallback( _
AddressOf GetCallbackResult))

'Threadオブジェクトを作成する Dim t As New System.Threading.Thread( _ New System.Threading.ThreadStart( _ AddressOf info.MyThreadMethod)) 'スレッドを開始する t.Start() Console.ReadLine() End Sub 'スレッド終了時に呼び出されるコールバックメソッド Private Shared Sub GetCallbackResult(ByVal returnValue As Integer) '結果を表示する Console.WriteLine(returnValue) End Sub

End Class

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

プログラマ歴が長い方にとって、くだらないことだとおもいますが、
自分は素直にこのようなコードを書きたいと思いました。

皆さんにとって素敵だなと思ったコード、規約、命名、コメント等
なんでもありです、皆さんの凄いを教えてください!

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

Dim list As New List(Of String)() From {"one", "two", "three"}
list.ForEach(New Action(Of String)(Sub(o) MessageBox.Show(o & "です!")

''''' 表示メッセージ '''''
oneです!
twoです!
threeです!

コレクションのForEach、デリゲートのActionの存在を初めて知りました!
便利ですね~
多用できそうです。

投稿2015/03/04 16:15

ranran

総合スコア85

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

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

0

匿名型とかどうでしょう。
データを格納するクラスがほしいが、
再利用性が薄いときなどに利用できますよね。
LINQ、ラムダ式、匿名型はセットで覚えるのがいいですね。

lang

1 ※即席で書いてますので細部はご容赦ください。 2 List<object[]> objList = new List<object[]> (); 3 objList.Add(...); 4 objList.Add(...); 5 objList.Add(...); 6 7 var query = objList.Select(item => { 8 // 匿名型(即席のクラスのように使えます。) 9 return new { ProductId = item[0] 10 ,ProductName = item[1] 11 ,Price = item[2] 12 ,Summary = item[3] 13 }; 14 }); 15 16 // LINQと組み合わせるととっても便利。 17 foreach(var item in query) { 18 Console.Write(item.ProductId); 19 Console.Write(item.ProductName); 20 Console.Write(item.Price); 21 Console.Write(item.Summary); 22 } 23

ただ、使いすぎると何でも匿名型にしたくなってしまって、
ちゃんとクラスを作るべきところも匿名型になっちゃったりするので要注意です。

投稿2015/02/27 11:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

ranran

2015/02/27 13:05

匿名型素晴らしい! 便利ですよね。 はじめてつかったのはGroupbyメソッドでです。 複数のキーでグループにできない! 探してもわからない!  それはもう大変いらいらしました(^^; 'グループで集約 Groupby(function(p1) new with{.name = p1.name,.age = p1.age}) 最終的に匿名型でできることに気づきました Linqも最高です '配列を文字列に Public Shared Function ListToString(ByRef list As List(Of String)) As String Return list.Aggregate(ControlChars.CrLf, Function(o, p) o & ControlChars.CrLf & p) End Function sirokuma0402の回答いただいて匿名型の便利さを再認識しました! 普段あまり使わないので、今後意識して楽できるところは楽したいと思います 回答ありがとうございました!
ranran

2015/02/27 13:07

さん付けが抜けてしまいました。 sirokuma0402さん失礼いたしました。
guest

0

私の場合、さりげない構文で発想の転換になった、yield return文です。
たとえば、ループで整数を加算しながら奇数だけ出力したい時、普通はこんな感じですね。

lang

1for ( int i=0; i < 10; i++ ) { 2 if ( i%2 != 0 ) Console.WriteLine(i); 3}

しかし、この処理をあちこちで再利用したいとなると、コピペになりがちです。
が、yield return文で「奇数だけの列挙子」と言うものが作れるようになります。

lang

1 public class Odd { 2 public Odd(int start, int end) { 3 this.start = start; 4 this.end = end; 5 } 6 private int start, end; 7 public IEnumerator<int> GetEnumerator() { 8 for ( int i = start; i <= end; i++ ) { 9 if ( i % 2 != 0 ) yield return i; 10 } 11 } 12 }

何が変わるかと言うと、foreach文で奇数だけが得られる点です。

lang

1foreach ( int i in new Odd(1,10) ) { 2 Console.WriteLine(i); 3}

この「GetEnumerator()」のメソッドの中では色々な処理が書けるので、たとえば「データベースにアクセスしながら、検索条件にマッチしたデータだけを返す」なんて列挙子も作れます。
LINQなども、この列挙子を使いまくったものになっているはずです。

投稿2015/02/20 16:33

shinosan

総合スコア209

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

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

ranran

2015/02/21 01:36

yield return文初見であります! 引数の区間の奇数を簡単に取得できかなり楽ですね コピペはしたくないですし、やはりシンプルな記述を心がけたいです LINQ便利ですよね♪ 今まで純粋なreturnのみ使っていましたので 今後yield returnを意識してみたいと思います! 回答ありがとうございます
ranran

2015/02/21 01:51

yield returnにのみ意識向いておりましたが GetEnumeratorを自身で定義したことが今までありませんでした! 今後は積極的に使用し、きれいなコードを記述したいと思います。 GetEnumerator,foreach,yield return すごく便利です。 感動しました、ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問