DOBON.NETプログラミング道掲示板

■ 「新規作成」から投稿できます。
■ マルチポストされた投稿を見つけたときは、その投稿に返信することによりご報告ください。その際は匿名で投稿し、マルチポストされている場所を併記してください。
■ スパム対策のため、メールアドレスの先頭に"_"という文字が付加されています。
RSS 2.0 RSS 2.0 | RSS 0.91 | 携帯電話用 | 自分専用のアイコンを使用するには | 掲示板への要望 | 管理人に連絡 | お気楽掲示板
■ 24時間以内に作成されたスレッドは New で表示されます。
■ 24時間以内に更新されたスレッドは UpDate で表示されます。

記事リスト ( )内の数字はレス数
NomalExcel Com オブジェクトの増殖(13) | NomalRichTextBoxのテキストをpictureBOXへ(12) | NomalPictureBoxの画像を連続保存(11) | NomalVB.NetでVB6.0と同じFontを指定しても同様に印刷されない(9) | Nomal作成した白黒画像をWordに貼り付けてから「図として保存」(8) | Nomal重なったPictureBox同士を透過する方法(7) | Nomalvb.netでExcelファイル操作(7) | NomalTreeViewの現在位置とDataGridViewの現在位置を合わせたい(7) | Nomalラジオボタンの一括設定(7) | NomalLabelで文字単位の背景色(7) | NomalTEXTBOXのプロパティを文字列に(7) | NomalDataAdapter.Updateで構文エラー(6) | Nomalキーボード+バーコードでキーボード入力を無効にしたい(6) | Nomaljumbo icon(256x256)が存在するか知る方法(6) | Nomal画像のスクロール(6) | Nomalタイマーの一括処理(6) | Nomal先頭に空白(スペース)があるファイルを読み込んでRichTextBoxへ書き出すとスペースが削除える(6) | NomalタッチキーボードでIMEを自動で切替えたい(6) | NomalPDFをフォーム上で表示させる方法につきまして(6) | Nomal特定のPCだけ発生する「パディングは無効なので削除できません」のエラーの原因(6) | Nomalシステムドライブ以外へのページング設定が反映されない(5) | Nomal全角シフト中にアクセスキーが効かない(5) | NomalVB.NETからcmdでpingを実行した時の結果(5) | NomalTabPageの背景色(5) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalグリッド表示レコードをJSONに変換(5) | NomalSeleniumで開いているページのTableを編集したい(5) | NomalMP4動画を再生する方法について(5) | NomalLableのカラー色を文字変数から変更したい(5) | NomalDatagridViewでファンクションキーを止めたい(5) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | Nomalブラウザでコピーした透過PNGを貼り付けたい(4) | NomalWebView2によるスクレ―ピング(4) | NomalC#でJpeg圧縮のTiffファイルを作成したい(4) | NomalDataGridViewのVirtualModeを有効した場合の実装方法(4) | Nomalテーブルを順番通りに直すプログラムを外部で読み込めるようにしたいです。(4) | Nomalソケット通信入門 ひらがな(4) | Nomal時間変数(文字列)の扱い(4) | NomalTreeViewとDataGridViewのスクロールを同期(シンクロ)させたい(4) | Nomalフォームのリサイズ時にDataGridViewが再描画されない(4) | NomalPDFをフォーム上で表示させる方法につきまして(4) | NomalアプリでHDMIへ出す解像度を変えたい(4) | Nomal画像の中心を基点に回転(4) | NomalDataGridViewの行ヘッダーに行番号を表示した時のエラー(4) | NomalASP.NET WebApi内でXmlReader.Create(url)がタイムアウトする(4) | Nomal抽象クラスで実装したクラスの情報を知る(3) | Nomal兆億万表記の文字列を数値に変換できる?(3) | NomalGetDirectoriesでルートを指定するとエラーになる(3) | NomalLinqにおける明示的型指定の方法(3) | Nomalデータベースからのテーブル名一覧の効率的な取得方法(3) | NomalC# Chart X軸上のグラフ表示(3) | NomalVB.NETでBluetoothデバイスの電池残量を取得する方法(3) | NomalWindowsフォームデザイナについて(3) | NomalDrawstringでの透過文字作成(3) | Nomalワンタイムパスワードのサイトに自動ログインしてアクセストークンを得る(3) | NomalJSONの複雑な入れ子内部の値を取りたい。(3) | Nomalシステム時計の設定(3) | NomalVisual Basicでエラーが出る(3) | Nomal継承元フォームで各フォームのボタン動作を検知したい(3) | NomalRichTextBoxへのドラッグ&ドロップしたExcelファイルの扱い(3) | Nomal表示動作が重くなる(3) | NomalLoadOptionのパラメータの意味(3) | Nomalforeachでループ回数を取得(2) | Nomalbitmapが保存できない(2) | Nomal特定ピクセルで画像を読み込みたい(2) | NomalDataGridViewでAlt+Enterで改行したい(2) | NomalProcessクラスからbatファイル実行後、KILLできない(2) | Nomal画面遷移(モーダルとモードレス)(2) | Nomal2つのradの数値から1つの角度を求めるコードを改善できますか?(C++)(2) | Nomalコンソールアプリで、WebView2の利用(2) | NomalEntity Frameworkは、使えるか?(2) | NomalC#のlong型でオーバーフローになる(2) | Nomal正規表現のパターン表記方法(2) | Nomalこういた物を作れますか?(2) | Nomalvb.netでのExcelファイルそうさ(2) | Nomalファイルとして配置したマニフェストを優先したい(2) | NomalVB2022でクリスタルレポートが開けない(2) | Nomalエクセルのみ監視ができない(2) | NomalExcelの数値 -> 日付みたいな関数?(2) | NomalSpinWait()を使う理由(2) | Nomalantecedentってなんですか?(2) | NomalRGB値の所得(2) | NomalVB.net からAccessDBへの接続(2) | NomalテキストボックスのValidatingイベントよりも先に発生するボタン発生イベントは何でしょう?(2) | NomalWindowsエクスプローラからのドラッグ&ドロップ(2) | Nomalクリックイベントでexeを作成できるか(2) | Nomalc#で日付型の定義の仕方で質問があります。(2) | Nomal列車の時間ごとの位置情報を表示したいです。(2) | NomalUrlにアクセスするとダウンロードされるファイルを捕まえる(2) | Nomalタブレット等でスワイプによるスクロールを実装(2) | Nomalbitmapを複数スレッドで処理したい(2) | Nomalツールボックスにtableadapterが表示されない(1) | Nomalアセンブリ情報が載らない(1) | Nomal二次元マップから値の取得(1) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | Nomalユーザーフォームに埋め込んだAutoCADの変化を捉える(0) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalChart X軸上の描画を切り替えたい(0) |



■記事リスト / ▼下のスレッド
■35121 / 親記事)  表示動作が重くなる
□投稿者/ たこ 一般人(7回)-(2022/08/01(Mon) 01:48:55)
  • アイコン環境/言語:[VB.NET、.NET Framework 4.7.2、VS2019] 
    分類:[.NET] 

    いつもお世話になります。

    ネットの通信状態を表示するフォームを作って表示させていますが、
    フォームの表示/非表示を繰り返すと動作が遅くなってしまいます。

    何が原因で問題が起こっているか解らず、お知恵をお貸しください。

    表示/非表示の部分
    -----------------------------------------------------------
      ''' <summary>
      ''' モニターForm
      ''' </summary>
      Private IOM As IOMonitor

      Private _IOMonitor = False

      ''' <summary>
      ''' IOモニター表示設定
      ''' </summary>
      ''' <returns>True:表示、False:非表示</returns>
      Public Overridable Property IOMonitor As Boolean
        Set(value As Boolean)
          _IOMonitor = value
          If _IOMonitor Then
            IOM = New IOMonitor(Me)
            IOM.Show()
          Else
            IOM.Close()
            IOM = Nothing
          End If
        End Set
        Get
          Return _IOMonitor
        End Get
      End Property
    -------------------------------------------

    メインクラスからモニターFormへはイベントで情報を渡しています。
    -------------------------------------------
    #Region "イベント定義"
      Public Delegate Sub DIODataEventHandler(ByVal sender As Object, ByVal e As NetDataEventArgs)
      ''' <summary>
      ''' ネット接続時のイベント
      ''' </summary>
      Public Event NetOpen As DIODataEventHandler
      ''' <summary>
      ''' ネット切断時のイベント
      ''' </summary>
      Public Event NetClose As DIODataEventHandler
      ''' <summary>
      ''' ネットエラー時のイベント
      ''' </summary>
      Public Event NetError As DIODataEventHandler
      ''' <summary>
      ''' データ送信時のイベント
      ''' </summary>
      Public Event SendData As DIODataEventHandler
    #End Region
    -------------------------------------------


    表示/非表示を繰り返す度に少しずつではありますが、メモリの使用容量が増ますので、
    ガーベージコレクションの問題かなと思い、
    GC.Collectとか入れてみましたが、上手く行きませんでした…

    よろしくお願いします。
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35122 / ResNo.1)  Re[1]: 表示動作が重くなる
□投稿者/ Azulean 大御所(532回)-(2022/08/01(Mon) 07:27:41)
  • アイコンNo35121に返信(たこさんの記事)
    > 何が原因で問題が起こっているか解らず、お知恵をお貸しください。
    現時点の情報ではわからないと思います。

    > メインクラスからモニターFormへはイベントで情報を渡しています。
    怪しむとしたらこのあたりでしょうか。

    たとえば、「メインクラスが公開するイベントに、モニターFormのイベントハンドラをAddHandlerしている」状態で、「RemoveHandlerを書いていない」、または「RemoveHandlerが実行されていない」なら、それが原因です。

    当てずっぽうで書くならこのくらいにとどまります。
    これではない場合は、フォームのコードやモニタクラスのコードなどの周辺コードも示しつつ、リークの量の数量イメージがわかる情報を共有してください。(〇〇KB など)
違反を報告
引用返信
■35123 / ResNo.2)  Re[2]: 表示動作が重くなる
□投稿者/ たこ 一般人(8回)-(2022/08/01(Mon) 12:21:35)
  • アイコンNo35122に返信(Azuleanさんの記事)
    > ■No35121に返信(たこさんの記事)

    >>メインクラスからモニターFormへはイベントで情報を渡しています。
    > 怪しむとしたらこのあたりでしょうか。
    >
    > たとえば、「メインクラスが公開するイベントに、モニターFormのイベントハンドラをAddHandlerしている」状態で、「RemoveHandlerを書いていない」、または「RemoveHandlerが実行されていない」なら、それが原因です。

    IOMonitorの初期化処理は次の様になっており、WithEventsでイベントを取得していますが、Addhandler/RemoveHandlerで書いた方が上手く行くのでしょうか?
    ちなみに今はこの様な形になっています。


    IOMonitor(Form)初期化処理
    -------------------------------------------
      Private WithEvents dc As DIO_LC
      Private Delegate Sub MonitorInvoke(sender As Object, e As NetDataEventArgs)


      Friend Sub New(dc As DIO_LC)

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.dc = dc
        DIOName.Text = Strings.Right("000" & Me.dc.Index, 3) & ":" & Me.dc.DIOName & vbCrLf & Me.dc.Place
        Me.Text = Me.dc.Index & ":" & Me.dc.DIOName
      End Sub
    -------------------------------------------

    イベント部処理  複数のスレッドから呼び出される為、Invokeしています。。。
    -------------------------------------------
      Private Sub dc_RecievedData(sender As Object, e As NetDataEventArgs) Handles dc.RecievedData
        If System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(e.Data).Substring(0, 1) = "R" Then
          If Me.InvokeRequired Then
            Me.Invoke(New MonitorInvoke(AddressOf DIO_Disp), sender, e)
            Return
          End If
          DIO_Disp(sender, e)
        End If
      End Sub
    -------------------------------------------

    ちょっと気づきました…

    Private Delegate Sub MonitorInvoke(sender As Object, e As NetDataEventArgs)

    この部分って表示/非表示される度に増えて行く気がします。

    検索したらDelegate.Removeと言うメソッドは見つけました…
    https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.remove?view=netframework-4.7.2

    …使用例が無く、使い方が全くわかりません^^;
    他にもRemoveAll、RemoveImplなどある様ですが、定義を読んでも解らず…


    どこか良い例が載っているサイトとかあれば教えてください。
違反を報告
引用返信
■35124 / ResNo.3)  Re[3]: 表示動作が重くなる
□投稿者/ たこ 一般人(10回)-(2022/08/01(Mon) 18:46:21)
  • アイコンNo35123に返信(たこさんの記事)
    > ■No35122に返信(Azuleanさんの記事)
    >>■No35121に返信(たこさんの記事)
    >

    > この部分って表示/非表示される度に増えて行く気がします。
    >
    > 検索したらDelegate.Removeと言うメソッドは見つけました…
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.delegate.remove?view=netframework-4.7.2
    >
    > …使用例が無く、使い方が全くわかりません^^;
    > 他にもRemoveAll、RemoveImplなどある様ですが、定義を読んでも解らず…


    解決しました!
    Azulean様のヒントを元にいろいろ試行錯誤し、次の様にしました。
    どうやらdcが邪魔をして遅くなっていた様です。
    念のため、MonitorInvoke.Remove(Nothing, Nothing)も入れました。(使い方合ってるかどうかは自信が無いですが…^^;

    -------------------------------------------
      Private Sub IOMonitor_Closing(sender As Object, e As CancelEventArgs) Handles Me.Closing
        dc.IOMonitorClose()  '表示/非表示のプロパティがdc側にある為、強制的にFalseにしている
        dc = Nothing
        MonitorInvoke.Remove(Nothing, Nothing)
      End Sub
    -------------------------------------------

    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35105 / 親記事)  LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(73回)-(2022/07/20(Wed) 08:21:43)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)
    「メソッドの呼び出し Load 時に OverwriteChanges または PreserveChanges オプションを指定すると、受信データが 'プライマリ データ ソースから送信され、DataTable が変更を DataTable追跡し、変更をデータ ソースに反映できることを前提とします。 Upsert オプションを選択した場合、データは、中間層コンポーネントによって提供されるデータなど、セカンダリ データ ソースのいずれかから取得されたものと見なされ、ユーザーによって変更される可能性があります。 この場合、意図は、1 つ以上のデータ ソースからデータを集計し、データをプライマリ データ ソース DataTableに反映することを前提とします。 この LoadOption パラメーターは、主キー比較に使用する行の特定のバージョンを決定するために使用されます。」

    この内容が全く理解できません。
    @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?
    A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?
    B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?
    C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    詳しい方宜しくお願い致します。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35106 / ResNo.1)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ Hongliang 大御所(631回)-(2022/07/20(Wed) 10:19:27)
  • アイコンまずそもそも、DataTable.Load(IDataReader, LoadOption)は、
    > Fills a DataTable with values from a data source using the supplied IDataReader. If the DataTable already contains rows, the incoming data from the data source is merged with the existing rows according to the value of the loadOption parameter.
    > IDataReaderによって提供されるデータソースの値でDataTableを満たします。データテーブルがすでに行を含んでいる場合、データソースからのデータはloadOptionパラメータの値に従って既存の行とマージされます。
    というメソッドであり、loadOptionパラメータは「データソースからのデータ」と「DataTableに既に存在しているデータ」のマージの方法を指定するものです。
    例えばDataTableが空であれば特に意味を持ちません。

    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    複数のデータソースを扱う場合の話ですね。
    大本のデータソースとなるDBからいったんFillして、追加分をまとめたXMLをセカンダリデータソースとしてLoadでマージするとか。

    > A 「プライマリ データ ソースから送信され」とは、Dt.Load()とした場合のDtにスキーマ情報が無い場合は、プライマリーデータからスキーマ情報をすべて取得することを前提としているという解釈でしょうか?

    この記述はスキーマ情報とは関係ないです。
    DataTableがスキーマを持っていない場合の挙動は別の段落に記載があります。
    (そしてDataTableがスキーマを持っていないならそのDataTableは空ということですから、loadOptionは意味を持ちません)

    > B 「データをプライマリ データ ソース DataTableに反映することを前提」とは、Dt.Load() のDtにスキーマ情報が存在する場合は、必要に応じて列の追加処理を行うという意味でしょうか?

    ここもスキーマとは関係ないです。
    スキーマに関することは別段落に記載があり、その際の挙動は表にまとめられています。
    OverwriteChanges/PreserveChangesでLoadしたデータはプライマリデータソースからのデータとみなし、あとあとデータソースに反映させることができるようにDataTableの変更を追跡する、ということです。
    一方Upsertは、Loadするデータがセカンダリデータソースからのデータであるとみなされます。

    > C 「主キー比較に使用する行の特定のバージョン」とは、OverwriteChangesは、Originalの主キーデータを、PreserveChangesは、Currentの、Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    表を見る限り、OverwriteChangesとPreserveChangesは同じになっていますが?
違反を報告
引用返信
■35107 / ResNo.2)  Re[1]: LoadOptionのパラメータの意味
□投稿者/ 魔界の仮面弁士 大御所(1436回)-(2022/07/20(Wed) 16:38:40)
  • アイコン2022/07/20(Wed) 16:46:02 編集(投稿者)

    No35105に返信(Wanさんの記事)
    > マイクロソフトのDocsのDataTable.Load メソッドのLoadOptionところに下記のような記述があります。
    > https://docs.microsoft.com/ja-jp/dotnet/api/system.data.datatable.load?view=net-6.0#system-data-datatable-load(system-data-idatareader-system-data-loadoption)

    機械翻訳で文章が崩れているので、人力翻訳されていた頃(VS2008 まで)の
    ドキュメントの方が読み解きやすいかも知れません。下記から入手できます。
    https://www.microsoft.com/ja-jp/download/details.aspx?id=20955

    上記をインストール後、該当ページはこのあたり。
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/37e7d8d2-8981-efdd-e808-c319ccb71685.htm
    ms-help://MS.MSDNQTR.v90.ja/fxref_system.data/html/16edeab2-613e-c1f8-a1bf-f39d9a655ad0.htm

    上記から引用:
    |
    | Load メソッドを呼び出すときに OverwriteChanges オプションまたは PreserveChanges オプションを
    | 指定した場合、受信データは DataTable の主データ ソースから受信されており、DataTable によって
    | 変更が追跡され、変更をデータ ソースに反映できることが想定されます。Upsert オプションを
    | 選択した場合、データは中間層コンポーネントから得られるデータなどの 2 次データ ソースの
    | 1 つから受信されていることが想定されます。これはユーザーにより変更されている可能性があります。
    | その場合、DataTable 内の 1 つ以上のデータ ソースのデータを集約した後、そのデータを
    | 主データ ソースに反映する意図があることが想定されます。主キーの比較に使用する
    | 行のバージョンを特定するために、LoadOption パラメータが使用されます。
    |
    ----
    |
    | 一般的に PreserveChanges オプションと OverwriteChanges オプションでは、ユーザーが
    | DataSet およびその変更を主データ ソースと同期する必要がある場合を想定しています。
    | Upsert オプションは、1 つ以上の 2 次データ ソースの変更を集約するときに役立ちます。
    |


    > @ プライマリーデータソース、セカンダリーデータソースって何ですか?
    > Load()の結果Setが複数あり、一つ目をプライマリー、二つ目以後を纏めてセカンダリーと呼んでるのでしょうか?

    DataTable は、単一の主データソース(a single primary data source)により同期・更新されます。
    さらに DataTable には、1 つ以上の 2 次データソース(one or more secondary data sources)の
    増分データ(incremental data)を加えることもできます。


    > C 「主キー比較に使用する行の特定のバージョン」とは、
    > OverwriteChangesは、Originalの主キーデータを、
    > PreserveChangesは、Currentの、
    > Upsertは、Originalが存在すればOriginalを存在しなければCurrentの値を比較するという意味であってますか?

    既存行に対する DataRow の特定は PrimaryKey 制約によって行われるわけですが、マッチングされた既存行の
    RowState As DataRowState プロパティに対して、LoadOption がどのように作用するのかを示したものですね。


    Load 時に OverwriteChanges が指定された場合、Original と Current の両方に書き込まれます。
    そして新データにマッチした既存行は、全て Unchanged 状態に上書きされます。
    Deleted 状態だった既存行も、削除が元に戻されて Unchanged 状態に復帰します。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に PreserveChanges が指定された場合、Original に書き込まれます。
    Added / Modifed な既存行は、いずれも Modifed 状態になります。
    Unchanged/Deleted な既存行の RowState はそのまま維持されます。
    既存行とマッチしない新規行も、 Unchanged 状態で取り込まれます。

    Load 時に Upsert が指定された場合、Current に対して書き込まれます。
    Added/Modifed な行の RowState はそのまま維持されます。
    Unchanged だった行は、新しい値に応じて Unchanged または Modified のいずれかになります。
    既存行とマッチしない新規行は、 Added 状態で取り込まれます。
違反を報告
引用返信
■35117 / ResNo.3)  Re[2]: LoadOptionのパラメータの意味
□投稿者/ Wan 付き人(74回)-(2022/07/27(Wed) 18:33:48)
  • アイコンHongliang様、魔界の仮面弁士様
    いつも御指南ありがとうございます。
    お返事したつもりが、遅れていなかったようで、結果的に、お礼が遅くなりすみません。
    両者に御指南頂いた内容を熟読して自己研鑽に励みたいと思います。
    現在格闘中です。

    有難うございました

解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-3]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35608 / 親記事)  foreachでループ回数を取得
□投稿者/ Wan 付き人(97回)-(2024/06/06(Thu) 15:16:44)
  • アイコン環境/言語:[.Net6 C# Windows] 
    分類:[.NET] 

    AngleSharpを使っています。

    foreachでループ回数を取得するためにLinqのSelect句を使用してIndexを使用しています。

    foreach ( var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => new { Value, Index }))
    {

     ここでLopItemをメソッドに渡したい。その時に、メソッド側で引数となるLopItemの型を指定したい。



    上のコードでは、ループ変数の型をvarを使って推論させていますが、
    具体的に型を指定する場合どのような型となるのでしょうか?

    ローカル変数で見るとvar LopItmの方は
    +LopItem{ Value = {AngleSharp.Html.Dom.HtmlListItemElement}, Index = 0 } <Anonymous Type>
    と表示されます。

    型として<Anonymous Type>「匿名型?」と

    すると、LopItemの型はどのように指定すれば良いのでしょうか?
    詳しい方宜しくお願い致します。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35609 / ResNo.1)  Re[1]: foreachでループ回数を取得
□投稿者/ 魔界の仮面弁士 大御所(1572回)-(2024/06/06(Thu) 17:03:14)
  • アイコン2024/06/06(Thu) 17:07:36 編集(投稿者)

    No35608に返信(Wanさんの記事)
    > 環境/言語:[.Net6 C# Windows] 
    .NET 6 は半年後にサポート期限が切れるので、
    .NET 8 への移行準備を進めておいた方が良いかと。


    > メソッド側で引数となるLopItemの型を指定したい。
    案1) メソッド引数を dynamic にして、匿名型をそのまま渡す
     foreach (var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => new { Value, Index }))
     {
      Foo1(LopItem)
     }
     void Foo1(dynamic lopItem)
     {
     }


    案2) 匿名型の代わりに、record class や record struct などを使う
     foreach (var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => new Example( Value, Index )))
     {
      Foo2(LopItem);
     }
     void Foo2(Example lopItem)
     {
     }
     record struct Example(AngleSharp.Dom.IElement Value, int Index);


    案3) 匿名型を止めて、タプルで渡す
     foreach (var LopItem in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => ( Value, Index )))
     {
      Foo3(LopItem);
     }
     void Foo3((AngleSharp.Dom.IElement Value, int Index) lopItem)
     {
     }


    案4) Value と Index を別引数にして渡す
     foreach (var (value, index) in doc.QuerySelectorAll(".news_list>li").Select((Value, Index) => (Value, Index)))
     {
      Foo4(value, index);
     }
     void Foo4(AngleSharp.Dom.IElement value, int index)
     {
     }
違反を報告
引用返信
■35610 / ResNo.2)  Re[2]: foreachでループ回数を取得
□投稿者/ Wan 付き人(98回)-(2024/06/07(Fri) 08:20:56)
  • アイコン魔界の仮面弁士様
    いつもありがとうございます

    dynamic型ってこのような使い方ができるのですね?
    今まで、他言語との連系などやることは無いと思い全く勉強していませんでした。
    この機会にかじってみようと思います。

    2案のrecord class や record struct についても全く想像も出来ませんでした。

    教えて頂いたことを、熟読してスキルアップにつなげたいと思います。
    ありがとうございました。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35604 / 親記事)  bitmapが保存できない
□投稿者/ K-1 一般人(1回)-(2024/05/03(Fri) 22:12:10)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    画像ファイルに対し加工を行うコードを作っています。
    画像ファイルを読み込み、バイト配列に変換して、バイト配列に対して加工を行い、画像ファイルとして保存するために以下のようなコードを書きました。

    // 画像読み込み
    Bitmap bitmap = new Bitmap(@"D:\temp\moto.bmp");

    /// Bitmapをバイト配列にする
    MemoryStream mms = new MemoryStream();
    bitmap.Save(mms, ImageFormat.Bmp);
    byte[] inputdata = mms.ToArray();
    mms.Close();
    mms.Dispose();

    MemoryStream ms = new MemoryStream(inputdata);
    Bitmap output_bitmap = new Bitmap(ms);
    ms.Close();
    ms.Dispose();

    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);

    変数inputdataにはBITMAPフォーマットそのままのバイナリが展開されているとこまで確認したので、BITMAP-BYTE変換は問題ないと思います。
    問題は最後の
    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);

    System.Runtime.InteropServices.ExternalException: 'GDI+ で汎用エラーが発生しました。'
    というエラーが出てしまいます。
    "D:\temp\ato.bmp"には54バイトのファイルが生成されており、powershellで「format-hex .\a.bmp」とダンプをとってみると変数inputdataの先頭54バイトと同じものがはいってるぽいです。

    この「'GDI+ で汎用エラーが発生しました。'」の対処法はないでしょうか。
違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35605 / ResNo.1)  Re[1]: bitmapが保存できない
□投稿者/ KOZ 一般人(36回)-(2024/05/04(Sat) 01:13:53)
  • アイコン2024/05/04(Sat) 01:18:08 編集(投稿者)

    No35604に返信(K-1さんの記事)
    > System.Runtime.InteropServices.ExternalException: 'GDI+ で汎用エラーが発生しました。'
    > というエラーが出てしまいます。

    Bitmap を作成するときに使った Stream オブジェクトは破棄しないでください。

    Bitmap output_bitmap = new Bitmap(ms);
    output_bitmap.Save(@"D:\temp\ato.bmp", ImageFormat.Bmp);
    ms.Dispose();

    この順番であればOKです。

    あと、Stream に関しては Close = Dispose ですので、どちらか一方を実行するだけで良いです。

    Stream の実装
    https://referencesource.microsoft.com/#mscorlib/system/io/stream.cs,dc4ffe046b847b84
違反を報告
引用返信
■35606 / ResNo.2)  Re[2]: bitmapが保存できない
□投稿者/ K-1 一般人(2回)-(2024/05/04(Sat) 08:58:28)
  • アイコンNo35605に返信(KOZさんの記事)
    > 2024/05/04(Sat) 01:18:08 編集(投稿者)

    うまくいきました!
    想定通りの画像が保存されていることも確認しました。
    ありがとうございます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]



■記事リスト / ▲上のスレッド
■35599 / 親記事)  特定ピクセルで画像を読み込みたい
□投稿者/ 午前の紅茶 一般人(1回)-(2024/05/01(Wed) 18:05:57)
  • アイコン環境/言語:[c#] 
    分類:[.NET] 

    Bitmap bitmap = new Bitmap(filename);
    と画像を読み込む処理があるのですが、読み込む画像はJPEGやPNG、BMPなどでピクセル深度もバラバラです。
    以後の処理のこともあるので、読み込まれたbitmapは24ビットなどに統一したいのですが、「24ビットで読み込む」ということはできないでしょうか。

    Bitmap bitmap = new Bitmap(filename);
    Bitmap bitmap24 = new Bitmap(bitmap.Width, bitmap.Height, PixelFormat.Format24bppRgb);

    こんな感じで24ビットのビットマップを作って読み込んだbitmapから貼り付けるというのも考えましたが、もうちょいスマートな方法はないでしょうか。

違反を報告
引用返信

▽[全レス2件(ResNo.1-2 表示)]
■35602 / ResNo.1)  Re[1]: 特定ピクセルで画像を読み込みたい
□投稿者/ Hongliang 大御所(651回)-(2024/05/02(Thu) 11:15:27)
  • アイコン標準ライブラリを使う限りは、特にほかの手段はなさそうですね。
    System.Windows.Media.Imagingの方だとFormatConvertedBitmapで変換部分は手軽に書けるようになってますが、結局一旦ロードしてから変換というのは変わりません。
違反を報告
引用返信
■35603 / ResNo.2)  Re[2]: 特定ピクセルで画像を読み込みたい
□投稿者/ 午前の紅茶 一般人(2回)-(2024/05/03(Fri) 10:50:25)
  • アイコンうーん、ないですか。
    仕方ないですね。
    ありがとうございます。
解決み!
違反を報告
引用返信

■記事リスト / レス記事表示 → [親記事-2]






Mode/  Pass/


- Child Tree -