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) | NomalVB.NETからcmdでpingを実行した時の結果(5) | NomalTabPageの背景色(5) | Nomalstyle.displayだと効率悪いから違うやり方をしたいです。(5) | Nomalグリッド表示レコードをJSONに変換(5) | NomalSeleniumで開いているページのTableを編集したい(5) | NomalMP4動画を再生する方法について(5) | NomalLableのカラー色を文字変数から変更したい(5) | NomalDatagridViewでファンクションキーを止めたい(5) | Nomalフォーム背景のみを半透明にしたい(5) | NomalCommandBuilderによって作られるCommandTextの内容(5) | NomalDataGridViewの特定セルにボタンを配置する方法(5) | 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) | Nomal1行で書くことできますか?(3) | 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読み出し元フォームの位置取得方法(2) | Nomalコンストラクターに続く{}の意味(2) | Nomalvb.netで7zの圧縮・解凍をしたい。(2) | Nomalツールボックスにtableadapterが表示されない(1) | Nomalアセンブリ情報が載らない(1) | Nomal二次元マップから値の取得(1) | NomalDataGridViewのドロップダウンリストの表示と選択後の値を分けたい(1) | NomalVSTOによるエクセルアドインのインストーラーでのアップデート(1) | Nomalクリスタルレポート 明細部のサブレポート(0) | Nomalインストーラにて、ローミングフォルダにファイルを配置したい(0) | NomalChart X軸上の描画を切り替えたい(0) |



■記事リスト / ▼下のスレッド
■35578 / 親記事)  抽象クラスで実装したクラスの情報を知る
□投稿者/ 夏風 一般人(1回)-(2024/02/20(Tue) 08:27:18)
  • アイコン環境/言語:[C#] 
    分類:[.NET] 

    はじめまして、夏風といいます。

    現在、DOBONさんの「オブジェクトの内容をファイルに保存、復元する
    オブジェクトのXMLシリアル化、逆シリアル化を行う」(https://dobon.net/vb/dotnet/file/xmlserializer.html)の記事を見ながら、抽象化クラスとして定義できないかと思っています。
    その中で、抽象化クラス側で実装クラスの型や実装クラスへのキャストの仕方がわからなく困っています。

    具体的には、
    >//XmlSerializerオブジェクトを作成
    > //オブジェクトの型を指定する
    > System.Xml.Serialization.XmlSerializer serializer =
    > new System.Xml.Serialization.XmlSerializer(typeof(SampleClass));
    のtypeof(SampleClass)の部分と
    > //XMLファイルから読み込み、逆シリアル化する
    > SampleClass obj = (SampleClass)serializer.Deserialize(sr);
    の(SampleClass)の部分をどうすればいいかわかりません。

    そもそも、抽象クラス側でこのようなことをすること自体が間違っているのでしょうか?
違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35579 / ResNo.1)  Re[1]: 抽象クラスで実装したクラスの情報を知る
□投稿者/ 魔界の仮面弁士 大御所(1569回)-(2024/02/20(Tue) 11:51:36)
  • アイコンNo35578に返信(夏風さんの記事)
    > 抽象化クラス側で実装クラスの型や実装クラスへのキャストの仕方がわからなく困っています。

    意図を理解できているか自信がありませんが、こういうことで良いのかな。


    public class SampleClass : SampleClassBase
    {
      public DateTime TimeStamp;
    }
    public class SampleClass2 : SampleClass { }

    public static class SampleClassBaseExtensions
    {
      public static T LoadFromFile<T>(this T @this, string fileName) where T : SampleClassBase => SampleClassBase.LoadFromFile<T>(fileName);
    }
    public abstract class SampleClassBase
    {
      public int Number;
      public string Message;

      public void SaveToFile(string fileName)
      {
        using (var sw = new System.IO.StreamWriter(fileName, false, new System.Text.UTF8Encoding(false)))
        {
          var serializer = new System.Xml.Serialization.XmlSerializer(GetType());
          serializer.Serialize(sw, this);
          sw.Close();
        }
      }

      public static T LoadFromFile<T>(string fileName) where T : SampleClassBase
      {
        using (var sr = new System.IO.StreamReader(fileName, new System.Text.UTF8Encoding(false)))
        {
          var serializer = new System.Xml.Serialization.XmlSerializer(typeof(T));
          var obj = (T)serializer.Deserialize(sr);
          sr.Close();
          return obj;
        }
      }
    }

    class MainClass
    {
      public static void Main()
      {
        string fileName = @"C:\test\sample.xml";

        SampleClass obj0 = new SampleClass { Message = "テストです。", Number = 123, TimeStamp = DateTime.Now };

        // <SampleClass>〜</SampleClass> な XML として保存される
        obj0.SaveToFile(fileName);

        // <SampleClass> な XML を SampleClass 以外の型に復元することはできない
        // var obj1 = SampleClassBase.LoadFromFile<SampleClassBase>(fileName);
        // var obj2 = SampleClassBase.LoadFromFile<SampleClass2>(fileName);

        // これらは正しい型なので復元できる
        SampleClass obj3 = SampleClassBase.LoadFromFile<SampleClass>(fileName);
        SampleClass obj4 = obj0.LoadFromFile(fileName);

        // SampleClass のインスタンスとして復元してから、SampleClassBase 型の変数に入れるのは OK
        SampleClassBase obj5 = SampleClassBase.LoadFromFile<SampleClass>(fileName);
        SampleClassBase obj6 = obj0.LoadFromFile(fileName);
      }
    }
違反を報告
引用返信
■35580 / ResNo.2)  Re[1]: 抽象クラスで実装したクラスの情報を知る
□投稿者/ とくま 一般人(4回)-(2024/02/20(Tue) 21:37:29)
  • アイコン
    No35578に返信(夏風さんの記事)
    数年前、同じようなこと考えて色々作り込んだ後、ジェネリックの部分だけ
    あれば事足りるんじゃないかという結論になったことがある。。。
        class MainClass
        {
            public static void Main()
            {
                const string strBasePath = @"C:\test\";
                string strForm1XML = Path.Combine(strBasePath, @"Form1Setting.xml");
                string strForm2XML = Path.Combine(strBasePath, @"Form2Setting.xml");
    
                clsGenericsTest<clsForm1Setting> obj1 = new clsGenericsTest<clsForm1Setting>(strForm1XML);
                clsForm1Setting objSaveItem1 = new clsForm1Setting();
                objSaveItem1.TimeStamp = DateTime.Now;
                obj1.SaveFile(objSaveItem1);
    
                clsGenericsTest<clsForm2Setting> obj2 = new clsGenericsTest<clsForm2Setting>(strForm2XML);
                clsForm2Setting objSaveItem2 = new clsForm2Setting();
                objSaveItem2.TimeStamp = DateTime.Now.AddDays(10);
                obj2.SaveFile(objSaveItem2);
            }
        }
        public class clsForm1Setting
        {
            public DateTime TimeStamp;
        }
        public class clsForm2Setting
        {
            public DateTime TimeStamp;
        }
        public class clsGenericsTest<T> where T : class, new()
        {
            private string _filePath;
            private clsGenericsTest() { }
            public clsGenericsTest(string FilePath) { _filePath = FilePath; }
            public void SaveFile(T item)
            {
                XmlSerializer serializer1 = new XmlSerializer(typeof(T));
                StreamWriter sw = new StreamWriter(_filePath, false, Encoding.GetEncoding("Shift_JIS"));
                serializer1.Serialize(sw, item);
                sw.Close();
            }
            public T ReadFile()
            {
                XmlSerializer serializer = new XmlSerializer(typeof(T));
                StreamReader sr = new StreamReader(_filePath, Encoding.GetEncoding("Shift_JIS"));
                T obj = (T)serializer.Deserialize(sr);
                sr.Close();
    
                return obj;
            }
        }

違反を報告
引用返信
■35581 / ResNo.3)  Re[2]: 抽象クラスで実装したクラスの情報を知る
□投稿者/ 夏風 一般人(4回)-(2024/02/21(Wed) 08:11:52)
  • アイコン魔界の仮面弁士さん、とくまさん
    回答ありがとうございます。

    まだ、さらっとしか見ていませんが、お二人とも同じような考え方で復元のところでジェネリックを使うようにするんですね。

    自分は、魔界の仮面弁士さんの例でいうとSampleClass自体がSampleClassBaseを継承して、LoadFromFileを読んだ時点でSampleClassのTimeStampを戻せないかなと考えていました。
    ただ、これだと実行するまで抽象クラス側では実際の型がわからないのでデバッグ時大変そうになりそうですね。

    お二人に提示していただいたものを参考に作成してみます。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35564 / 親記事)  兆億万表記の文字列を数値に変換できる?
□投稿者/ Wan 付き人(95回)-(2023/12/17(Sun) 17:15:04)
  • アイコン環境/言語:[VisualBasic2022 Windows10 C# .NET6] 
    分類:[.NET] 

    兆億万表記の文字列を数値に変換しようと考えています。
    
    初心者ながら思いついたのが、下記のコードです。
       void Test億万円()
       {
           String T1 = "11兆200億3400万5円";
           String T2 = "123兆1695億7万500円";
           String T3 = "200億3400万5円";
           String T4 = "123兆7万500円";
           String T5 = "3400万5円";
           String T6 = "123兆1695億500円";
           String T7 = "5円";
           String T8 = "123兆円";
           String T9 = "123万";
           String T10 = "123";
    
           string s1 = T10;
    
           string Pattan兆 = "(\\d{1,4})兆";
           string Pattan億 = "(\\d{1,4})億";
           string Pattan万 = "(\\d{1,4})万";
           string Pattan円 = "(\\d{1,4})円";
           
           var Reg兆 = Regex.Match(s1, Pattan兆);
           long 兆 = Reg兆.Groups.Count > 1 ? long.Parse(Reg兆.Groups[1].Value) * 1_0000_0000_0000 : 0;
           var Reg億 = Regex.Match(s1, Pattan億);
           long 億 = Reg億.Groups.Count > 1 ? long.Parse(Reg億.Groups[1].Value) * 1_0000_0000 : 0;
           var Reg万 = Regex.Match(s1, Pattan万);
           long 万 = Reg万.Groups.Count > 1 ? long.Parse(Reg万.Groups[1].Value) * 1_0000 : 0;
           var Reg円 = Regex.Match(s1, Pattan円);
           long 円 = Reg円.Groups.Count > 1 ? long.Parse(Reg円.Groups[1].Value) : 0;
           long 何円 = 兆 + 億 + 万 + 円;
    
           MessageBox.Show(String.Format("{0:#,0}", 何円));
       }
    
    T1〜T10は、サンプル
    当然、T10は、0になってしまいます。
    正規表現でグループ分けして、兆はGroup[2]、億はGroup[4]、万はGroup[6]、円はGroup[8](Indexは、適当に表現しており、億があろうがなかろうが?固定のGroupインデックスならOK)を目指しましたが、正規表現が書けませんでした。
    
    円の有無を含めた処理方法について、お知恵を拝借できませんでしょうか?
    
    

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35566 / ResNo.1)  Re[1]: 兆億万表記の文字列を数値に変換できる?
□投稿者/ Azulean 大御所(542回)-(2023/12/17(Sun) 20:44:58)
  • アイコン以下の部分を、
    string Pattan円 = "(\\d{1,4})円";

    以下のように変更すればいけるのではないでしょうか?
    string Pattan円 = "(\\d{1,4})円?$";


    ? … 直前の文字が 0 回 or 1回数出現
    $ … 文末を意味する。

    https://learn.microsoft.com/ja-jp/dotnet/standard/base-types/regular-expression-language-quick-reference
違反を報告
引用返信
■35567 / ResNo.2)  Re[2]: 兆億万表記の文字列を数値に変換できる?
□投稿者/ Azulean 大御所(543回)-(2023/12/17(Sun) 20:57:47)
  • アイコン
    ここまでいけばよいのだろうけど、パターンが難解すぎるので、コピペNGで考えてください。
    パターンの意味を理解できずにコピペすると、説明を求められたときや改良しないと行けなくなったときに詰みます。
    
    自分できちんと理解し、書き直せるぐらいになれば良いです。
    
    
    void Main()
    {
    	String T1 = "11兆200億3400万5円";
    	String T2 = "123兆1695億7万500円";
    	String T3 = "200億3400万5円";
    	String T4 = "123兆7万500円";
    	String T5 = "3400万5円";
    	String T6 = "123兆1695億500円";
    	String T7 = "5円";
    	String T8 = "123兆円";
    	String T9 = "123万";
    	String T10 = "123円";
    	
    	string s1 = T10;
    
    	TestFunc(T1);
    	TestFunc(T2);
    	TestFunc(T3);
    	TestFunc(T4);
    	TestFunc(T5);
    	TestFunc(T6);
    	TestFunc(T7);
    	TestFunc(T8);
    	TestFunc(T9);
    	TestFunc(T10);
    }
    
    private static void TestFunc(string s1)
    {
    	string pattern = @"^(?:(?<兆>\d{1,4})兆)?(?:(?<億>\d{1,4})億)?(?:(?<万>\d{1,4})万)?(?:(?<円>\d{1,4})円?|円)?$";
    	var reg = Regex.Match(s1, pattern);
    
    	var 桁 = new Dictionary<string, long> {
    		["兆"] = 1_0000_0000_0000,
    		["億"] = 1_0000_0000,
    		["万"] = 1_0000,
    		["円"] = 1
    	};
    
    	long 何円 = 0;
    	foreach (var pair in 桁)
    	{
    		if (0 < reg.Groups[pair.Key].Length)
    		{
    			何円 += long.Parse(reg.Groups[pair.Key].Value) * pair.Value;
    		}
    	}
    	Console.WriteLine(String.Format("{1} = {0:#,0}", 何円, s1));
    }
    

違反を報告
引用返信
■35569 / ResNo.3)  Re[3]: 兆億万表記の文字列を数値に変換できる?
□投稿者/ Wan 付き人(96回)-(2023/12/18(Mon) 08:28:24)
  • アイコンAzulean様
    大変丁寧な御指南ありがとうございます。

    string pattern = @"^(?:(?<兆>\d{1,4})兆)?(?:(?<億>\d{1,4})億)?(?:(?<万>\d{1,4})万)?(?:(?<円>\d{1,4})円?|円)?$";
    の結果は、まさしく私が求めていたものです。

    が、このようなパターンは、私の実力では、何日かけてもかけなかったと痛感しました。

    折角、お手本を書いていただいたので、単にコピペするのではなく、熟読し研鑽したいと思います。

    本当にありがとうございました。

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

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35563 / 親記事)  GetDirectoriesでルートを指定するとエラーになる
□投稿者/ DISP 一般人(1回)-(2023/12/17(Sun) 13:40:39)
  • アイコン環境/言語:[Microsoft Visual Studio Community 2019 / VB.NET] 
    分類:[.NET] 

    Dim sub_Folders As String() = System.IO.Directory.GetDirectories(Me.OutputTextBox.Text, "*", System.IO.SearchOption.AllDirectories)
    でG:\ドライブ直下のフォルダ一覧を取得しようとしたのですが、
    ------------------------------------------------
    System.UnauthorizedAccessException
    HResult=0x80070005
    Message=パス 'G:\System Volume Information' へのアクセスが拒否されました。
    Source=<例外のソースを評価できません>
    スタック トレース:
    <例外のスタック トレースを評価できません>
    ------------------------------------------------
    というエラーが出てしまいます。
    Me.OutputTextBox.Textには「G:\」という文字列が入っています。
    試しに
    Dim sub_Folders As String() = System.IO.Directory.GetDirectories("D:\\", "*", System.IO.SearchOption.AllDirectories)
    と変えてみたら通ったので「G:\\」にしてみると同じエラーになってしまいます。

    GドライブはUSB接続のSSDドライブ、Dドライブは内蔵HDDです。両方ともNTFSフォーマットです。
    外部ドライブのときは何か指定とか必要なのでしょうか。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35565 / ResNo.1)  Re[1]: GetDirectoriesでルートを指定するとエラーになる
□投稿者/ Azulean 大御所(541回)-(2023/12/17(Sun) 20:39:55)
  • アイコンNo35563に返信(DISPさんの記事)
    > Dim sub_Folders As String() = System.IO.Directory.GetDirectories(Me.OutputTextBox.Text, "*", System.IO.SearchOption.AllDirectories)
    > でG:\ドライブ直下のフォルダ一覧を取得しようとしたのですが、
    > ------------------------------------------------
    > System.UnauthorizedAccessException
    > HResult=0x80070005
    > Message=パス 'G:\System Volume Information' へのアクセスが拒否されました。
    (略)
    > というエラーが出てしまいます。

    そういうものです。
    ドライブのルートには、システム用に隠されたフォルダーが存在しています。
    このフォルダーを含めて「すべてサブフォルダーを取得」と実行すると、アクセス権がないのでエラーになります。

    > GドライブはUSB接続のSSDドライブ、Dドライブは内蔵HDDです。両方ともNTFSフォーマットです。
    > 外部ドライブのときは何か指定とか必要なのでしょうか。

    G:\ だろうと、D:\ だろうと、C:\ だろうと、同様にエラーが起きるはずです。
    このため、ドライブルートからまとめて AllDirectories を実行するのは避け、TopDirectoryOnly を用いて、例外をキャッチしながら列挙することを考えてください。
違反を報告
引用返信
■35568 / ResNo.2)  Re[2]: GetDirectoriesでルートを指定するとエラーになる
□投稿者/ DISP 一般人(3回)-(2023/12/18(Mon) 06:38:09)
  • アイコン2023/12/18(Mon) 06:39:14 編集(投稿者)

    No35565に返信(Azuleanさんの記事)
    うーん、そういうものなのですが。
    ありがとうございます。
解決み!
違反を報告
引用返信
■35570 / ResNo.3)  Re[3]: GetDirectoriesでルートを指定するとエラーになる
□投稿者/ Hongliang 大御所(650回)-(2023/12/18(Mon) 16:27:24)
  • アイコン.NET 5以降であれば、EnumerationOptionsというクラスが用意されていて、これにIgnoreInaccessibleプロパティがあるので、これをGetDirectoriesに渡すことでアクセスできないフォルダを無視することもできるようになっているのですが。
解決み!
違反を報告
引用返信

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



■記事リスト / ▼下のスレッド / ▲上のスレッド
■35559 / 親記事)  Linqにおける明示的型指定の方法
□投稿者/ Wan 付き人(93回)-(2023/12/14(Thu) 10:38:25)
  • アイコン環境/言語:[VisualBasic2022 Windows10 C# .NET6] 
    分類:[.NET] 

    VB.Netでは、下記のコードが問題無く動きます。
    Dim Result As List(Of List(Of String))
    Result = doc.QuerySelectorAll("#container table")(0).QuerySelectorAll("tr").Select(Function(n) n.QuerySelectorAll("th,td").Select(Function(g) g.TextContent).ToList).ToList

    しかし、C#に移植すると、一つ目のSelectで、「型引数を使い方から推論することはできません。型引数を明示的に指定してください。」とエラーがでます。
    List<List<string>> result = new();
    result= doc.QuerySelectorAll("#container table")[0].QuerySelectorAll("tr").Select( n => n.QuerySelectorAll("th,td").Select(g => g.TextContent).ToList).ToList;

    下記のHPをみると、一つ目のSelectでSelect<キャストする内容を書く>とありますが、何を書けば良いのか?さっぱりわかりません。
    https://qiita.com/noutarins/questions/5c12cdbd694276f598ee
    weponDates.OrderBy(x => x.GetobjectNumber)
    weponDates.OrderBy<WeponDate, int>(x => x.GetobjectNumber)

    どなたか?詳しい方教えて頂けないでしょうか?
    なぜ?VBではOKなのに、C#では、ダメなんでしょうか?
    宜しくお願い致します。

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35560 / ResNo.1)  Re[1]: Linqにおける明示的型指定の方法
□投稿者/ Hongliang 大御所(649回)-(2023/12/14(Thu) 12:09:20)
  • アイコン2023/12/14(Thu) 12:13:20 編集(投稿者)
    2023/12/14(Thu) 12:12:33 編集(投稿者)

    .NETの標準ライブラリにQuerySelectorAllというメソッドを持つ型は存在しないように思うのですが、何らかの外部ライブラリを使っているのであれば提示していただきたいですね。

    > result= doc.QuerySelectorAll("#container table")[0].QuerySelectorAll("tr").Select( n => n.QuerySelectorAll("th,td").Select(g => g.TextContent).ToList).ToList;
    恐らくですが、型推論できないのは、ToListがメソッド呼び出しではなくメソッド自体を返しているのが原因です。
    C#の場合、引数がない場合のメソッド呼び出しに際して括弧を省略することはできません。
    .ToList()
    と記述する必要があります。
    こうすることでSelectに渡すラムダ式の返値がstringであると推論できるようになります。

    括弧を使わずにhoge.ToListとだけ記述した場合、VBでいうところの
    AddressOf hoge.ToList
    みたいな意味になります。
違反を報告
引用返信
■35561 / ResNo.2)  Re[1]: Linqにおける明示的型指定の方法
□投稿者/ 魔界の仮面弁士 大御所(1568回)-(2023/12/14(Thu) 13:23:38)
  • アイコンNo35559に返信(Wanさんの記事)
    > = doc.QuerySelectorAll(
    変数 doc の型は何ですか?

    QuerySelectorAll メソッドを持つ HTML Parser ということは、
    System.Windows.Forms.HtmlDocument や
    HtmlAgilityPack.HtmlDocument ではなさそうですし、
    可能性としては
    Aspose.Html.HTMLDocument か
    AngleSharp.Html.Dom.IHtmlDocument が
    思い当たりますが、もしかしたら他のパーサーかもしれません。


    > Dim Result As List(Of List(Of String))
    > Result = doc.QuerySelectorAll("#container table")(0).QuerySelectorAll("tr").Select(Function(n) n.QuerySelectorAll("th,td").Select(Function(g) g.TextContent).ToList).ToList
    この構文だと、AngleSharp の可能性が高そうですが…違っていたらすみません。

    そして上記は、正確には .ToList ではなく .ToList() と書いた方が望ましいです。
    ただし VB では「引数の無いメソッド」では括弧を省略できるので、省略しても間違いではありません。


    > List<List<string>> result = new();
    VB に合わせるなら、「= new()」が余計だと思いますよ?
    あるいはせめて「= default!」かと。

    > result= doc.QuerySelectorAll("#container table")[0].QuerySelectorAll("tr").Select( n => n.QuerySelectorAll("th,td").Select(g => g.TextContent).ToList).ToList;
    VB と違って、C# ではメソッド呼び出し時の括弧を省略できません。(COM 参照だと許可されるケースもあるけれど)
    つまり、.ToList ではなく .ToList() です。

    「).ToList).ToList;」→「).ToList()).ToList();」
違反を報告
引用返信
■35562 / ResNo.3)  Re[1]: Linqにおける明示的型指定の方法
□投稿者/ Wan 付き人(94回)-(2023/12/15(Fri) 08:50:29)
  • アイコンHongliang様
    魔界の仮面弁士様
    いつも御指南ありがとうございます。

    お二方のご指摘の通り、()を付けただけで解決しました。
    外部ライブラリは、ご指摘の通り、AngleSharpです。情報が不足しており申し訳ありませんでした。

    Linqを書く時に、前のメソッドが何を返すのかを気にして次のメソッドを書いていたので型推論も同じようにしていると勘違いしていました。

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

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



■記事リスト / ▲上のスレッド
■35546 / 親記事)  データベースからのテーブル名一覧の効率的な取得方法
□投稿者/ Wan 付き人(86回)-(2023/11/21(Tue) 10:22:38)
  • アイコン環境/言語:[VisualBasic2019 Windows10 Basic Framework4.7.2] 
    分類:[.NET] 

    あるデータベースのテーブル名一覧をList<String>で返す関数を作りました。
    一応、目的通りに動いているのですが、なんとなく?もっと、効率のいい方法があるような気がしていますが、まったく思いつきません。
    ベテランの方のアドバイスを頂ければ幸いに存じます。
    宜しくお願い致します。
    
    Private Function GetTableNames(con As SqlConnection) As List(Of String)
         Dim dtTableNames As New DataTable
    Dim Da As New SqlDataAdapter
         Dim SqlGetTableNames As String = "select name from sys.tables;"
         Dim cmd As New SqlCommand(SqlGetTableNames, con)
         Da.SelectCommand = cmd
         Da.Fill(dtTableNames)
         Dim query = From order In dtTableNames.AsEnumerable
                     Select order.Field(Of String)("name")
         Dim tableNameList As List(Of String) = query.AsEnumerable.ToList
         Return tableNameList
     End Function
    
    

違反を報告
引用返信

▽[全レス3件(ResNo.1-3 表示)]
■35547 / ResNo.1)  Re[1]: データベースからのテーブル名一覧の効率的な取得方法
□投稿者/ 魔界の仮面弁士 大御所(1567回)-(2023/11/21(Tue) 13:32:04)
  • アイコンNo35546に返信(Wanさんの記事)
    > あるデータベースのテーブル名一覧をList<String>で返す関数を作りました。

    SqlCommand なので、あるデータベースとは「SQL Server」ですね。
    sys.tables は対 SQL Server に対してしか使えませんが、
    手法としては特に問題無いと思いますよ。


    データベースへの依存度を減らした汎用的な方法としては、
    OLE DB Provider に対してスキーマを問い合わせる手法があります。

    'tbl = con.GetSchema("MetaDataCollections")
    'tbl = con.GetSchema("Databases")
    tbl = con.GetSchema("Tables")
    'tbl = con.GetSchema("Columns")
    'tbl = con.GetSchema("IndexColumns")
    など。
    ADODB の場合は OpenSchema メソッドで同じことができます。


    > なんとなく?もっと、効率のいい方法があるような気がしていますが、まったく思いつきません。
    実行効率面では、DataAdapter.Fill を使うよりは、ExecuteReader の方が良いですね。
違反を報告
引用返信
■35548 / ResNo.2)  Re[2]: データベースからのテーブル名一覧の効率的な取得方法
□投稿者/ Wan 付き人(87回)-(2023/11/22(Wed) 14:30:50)
  • アイコン魔界の仮面弁士
    いつも御指南ありがとうございます。

    凄く、不安だったのですが、太鼓判を押して頂けたようで安心しました。

    加えて、教えて頂いたことは、引き続き熟読して、マスターしていきたいと思います。

    ありがとうございました。

違反を報告
引用返信
■35549 / ResNo.3)  Re[3]: データベースからのテーブル名一覧の効率的な取得方法
□投稿者/ Wan 付き人(88回)-(2023/11/22(Wed) 14:31:16)
  • アイコン解決済みです。

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

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






Mode/  Pass/


- Child Tree -