C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

全過去ログを検索

<< 0 >>
■7324  Re[11]: Imageクラスの継承
□投稿者/ 渋木宏明(ひどり) -(2007/09/03(Mon) 21:25:34)
>
    > やっぱりBitmapクラスに極力、互換を持たせないと
    > Bitmapから始めた自分には、ちょっとつらいかなぁって...

    全部のメンバなんか使います?

    > 今の自分の課題としては、「そう書ける」ことがかなり重要です。

    まぁ、その辺は感覚的なモンなんでなんとも。。。なんですが。

    例えば、コレクションも「配列のようなもの」であって「配列ではないもの」なので

    Hoge[] GetHogeArray()
    {
    List<hoge> list = new List<Hoge>();

    list.Add(hoge1);
    list.Add(hoge2);

    return list.ToArray();
    }

    のように使うのが当たり前ですけど、これにも違和感を感じますか?

    > そこで、ググってたら「インデクサでGet,Set」なるものを発見しましたが、

    えーと、1個前に

    > 暗黙のキャストで Bitmap を返すようにして誤魔化す

    と書いたんですが、検索とかしてみませんでした?

    http://tech.bbtune.com/csharp/items/3-18.html

    とか。

記事No.7288 のレス /過去ログ18より / 関連記事表示
削除チェック/

■17905  Re[2]: 例外処理をするべきか否か
□投稿者/ 通りすがり -(2008/05/03(Sat) 13:17:03)
    あ、説明不足だったかもしれません。すみません。

    作っているアプリケーションの設定情報をデシリアライズしようとしてるんですけど、
    アプリのバージョンアップに伴って、フィールドが若干増えました。
    なので、増えた分は名前で値をとってくることができないので、この質問スレッドを立てさせてもらった次第です。
    逆に、削除されたメンバの場合はGet***しようとしないので問題ないですが。

    もし、_valが新たに追加されたフィールドの場合、

     _val = info.GetDouble("val");

    ってやると死んじゃうので、どうしようかなぁー...、と。
    _valは必ず存在するべき値です。
    なので、_valが見つからなかったら適当な値で初期化したいんです。
記事No.17850 のレス /過去ログ36より / 関連記事表示
削除チェック/

■60766  Re[10]: 趣味の質問たかが3目並べされど三目並べ
□投稿者/ ピーター -(2011/07/17(Sun) 14:57:13)
    No60764 (flied onion さん) に返信

    >>ところで、この問題でいうところの「ありえない局面」は考慮に入っているのだろうか?
    >
    > リンク先の問題に「ありえない局面が入力されることはありません。」と書いてあります。

    これは小生に対する意見であろうか?

    >>ところで、この問題でいうところの「ありえない局面」は考慮に入っているのだろうか?

    とは、「ありえない局面が入力されることはありません。」という条件が質問者の提示コードには考慮されているのかどうか
    (つまり、ありえない局面がインプットされないことを前提に設計されたものなのかどうか)という疑問であるのだが、

    > リンク先の問題に「ありえない局面が入力されることはありません。」と書いてあります。

    これは小生に何を伝えたいのか、分かりやすく説明して貰えないだろうか。

    >
    >>マスがすべて埋まっていない場合
    >>マスがすべて埋まっている場合
    > マスがすべて埋まっていない場合か、マスがすべて埋まった場合かは全てのマスをみないとわかりません。
    > (入力は常に全マス分であり、oかxか空白を表すsです。ループするとか全部ANDして'h'になるかとかなにかしら判断が必要でしょう)

    この判断は必要である。
    このレスのひとつ前のレスに、アルゴリズムのコンパクトさを記述したので見て頂きたい。
記事No.60636 のレス /過去ログ102より / 関連記事表示
削除チェック/

■64909  Re[8]: VB.netの買い方について教えて下さい
□投稿者/ MP枯渇ウィザード -(2013/01/22(Tue) 11:39:01)
    Windows8を使っていて、かつWindowsストアアプリを作る予定がないのであれば、
    VisualStudio2010でもいいと思います。
    ただし、最新じゃないものは安いかもしれないけど、サポートの打ち切りも
    早いということは留意したほうがいいと思います。

    ProfessionalとExpressの違いって、VisualC++でMFCが使えるか使えないか位しかイメージがないんですけど、
    VBで何か違いってありましたっけ・・・?
記事No.64877 のレス /過去ログ109より / 関連記事表示
削除チェック/

■66834  Re[1]: C#でExcelを扱う際の解放について
□投稿者/ shu -(2013/05/30(Thu) 11:50:33)
    2013/05/30(Thu) 11:51:48 編集(投稿者)

    No66832 (のぶ さん) に返信
    > いつもお世話になっています。
    > C#でExcelを扱う際の解放について確認したく思うのでよろしくお願いします。
    >
    > 例えば以下の様なコードの場合、★のsheetの参照が残ってしまうのではないかと思っています。
    > このような場合は別の変数に代入し、それぞれ解放処理をした方が安全なのでしょうか?
    >
    > それと、解放漏れを確認する方法は参照カウントを取得するしかないのでしょうか?
    >
    sheetを別変数にするか代入する前に前の物を解放する必要があります。
    またsheetsを変数に取得して解放することが必要です。

    sheets[name]
    の完全な記述は
    sheets.Item[name]
    となりsheetsというオブジェクトのItemプロパティでsheetを取得しています。
記事No.66832 のレス /過去ログ113より / 関連記事表示
削除チェック/

■67931  Re[3]: サーバーからのエラーメールの受信先の変更
□投稿者/ 魔界の仮面弁士 -(2013/09/10(Tue) 23:13:00)
    No67930 (redhat さん) に返信
    > 名前空間:System.Net.MailのMailMessageクラスにHeadersプロパティというのを見つけました。

    失礼しました。エラーメールの返信先は Return-Path ヘッダーが使われますが、
    送信側がつけるものではなく、メールサーバーが付与するものであり、
    msg.Headers.Add("Return-Path", returnEmail); ではダメなようです。

    手元に環境が無いので確認できませんが、MailMessage に対して
    msg.From = New System.Net.Mail.MailAddress("sender@example.com")
    msg.Sender = New System.Net.Mail.MailAddress("return@example.com")
    だとどうでしょうか。
記事No.67927 のレス /過去ログ115より / 関連記事表示
削除チェック/

■88223  c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ ユウタ -(2018/08/09(Thu) 22:06:57)

    分類:[C#] 

    forを使わずにエクセルのセル範囲をstring型で1次配列に格納したいのですが、可能でしょうか。
    (大量の値を格納するためforだと処理が遅くなるため高速化したいです)

    以下コードの場合、Console.WriteLineでは「System.__ComObject」と出力されてしまいます。
    AAA.xlsxには、1列目に5000行目まで文字列が入っています。

    using System;
    using System.Linq;
    using usgExcel = Microsoft.Office.Interop.Excel;

    namespace Test_エクセルを1次配列化
    {
    class Program
    {
    static void Main(string[] args)
    {
    string FilePath = @"C:\AAA.xlsx";

    usgExcel.Application myExcel = new usgExcel.Application();
    myExcel.Visible = true;
    usgExcel.Workbook myWorkBook = null;

    myWorkBook = myExcel.Workbooks.Open(FilePath);
    usgExcel.Worksheet myWorkSheet = myWorkBook.Sheets["Sheet1"];
    usgExcel.Range myRange = myWorkSheet.Range[myWorkSheet.Cells[1, 1], myWorkSheet.Cells[5000, 1]];
    object[] myRangeObj = (myRange).Cast<object>().ToArray();

    Console.WriteLine(Convert.ToString(myRangeObj[1]));
    Console.WriteLine(Convert.ToString(myRangeObj[2]));
    Console.WriteLine(Convert.ToString(myRangeObj[3]));
    Console.ReadKey();
    }
    }
    }
親記事 /過去ログ151より / 関連記事表示
削除チェック/

■88228  Re[1]: c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ furu -(2018/08/10(Fri) 09:57:42)
    No88223 (ユウタ さん) に返信

    値はValueで、Range.Valueは2次元配列で返ってきます。

    > object[] myRangeObj = (myRange).Cast<object>().ToArray();
    >
    > Console.WriteLine(Convert.ToString(myRangeObj[1]));
    > Console.WriteLine(Convert.ToString(myRangeObj[2]));

    object[,] myRangeObj = myRange.Value;

    Console.WriteLine(Convert.ToString(myRangeObj[1, 1]));
    Console.WriteLine(Convert.ToString(myRangeObj[2, 1]));
記事No.88223 のレス /過去ログ151より / 関連記事表示
削除チェック/

■88231  Re[1]: c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ 魔界の仮面弁士 -(2018/08/10(Fri) 11:18:47)
    No88223 (ユウタ さん) に返信
    > forを使わずにエクセルのセル範囲をstring型で1次配列に格納したいのですが、可能でしょうか。
    > (大量の値を格納するためforだと処理が遅くなるため高速化したいです)

    No88228 で既に回答がついていますが、2 次元配列で読み書きすることなら可能です。


    Range が単一のセル範囲を表す場合
     Value プロパティは単一の値を返します。

    Range が連続した複数のセル範囲を含む場合
     Value プロパティは 2 次元配列を返します。
     1 次元目が行方向(縦)、2 次元目が列方向(横)を意味します。

    Range が非連続のセル範囲を含む場合
     Values からは最初の連続領域のみの内容が返されます。
     すべてを取り出す場合は、Areas プロパティを使って
     連続領域ごとの Range に分解してから
     それぞれの Value プロパティを呼び出すようにします。


    なお、Value プロパティからの返却値を受け取る場合、
    C# では先頭が 1 から始まる特殊な配列として返却される可能性があります。
    (VB.NET の場合は、常に 0 始まりに補正されます)




    using System;
    using System.Linq;
    using System.Runtime.InteropServices;
    using usgExcel = Microsoft.Office.Interop.Excel;
    namespace Test_エクセルを1次配列化
    {
     class Program
     {
      static void Main(string[] args)
      {
       string FilePath = @"C:\AAA.xlsx";

       usgExcel.Application myExcel = new usgExcel.Application();
       myExcel.Visible = true;
       usgExcel.Workbooks myWorkBooks = myExcel.Workbooks;
       usgExcel.Workbook myWorkBook = myWorkBooks.Open(FilePath);
       usgExcel.Sheets mySheets = myWorkBook.Sheets;
       usgExcel.Worksheet myWorkSheet = mySheets["Sheet1"];

       usgExcel.Range myCells = myWorkSheet.Cells;
       usgExcel.Range myCells1 = myCells[1, 1];
       usgExcel.Range myCells2 = myCells[5000, 1];
       usgExcel.Range myRange = myWorkSheet.Range[myCells1, myCells2];

       // 二次元配列として取得されます
       // 1..5000 になるか、0..4999 になるかは環境依存
       object[,] values = myRange.Value;

       Marshal.FinalReleaseComObject(myCells1);
       Marshal.FinalReleaseComObject(myCells2);
       Marshal.ReleaseComObject(myRange);
       Marshal.ReleaseComObject(myCells);
       Marshal.ReleaseComObject(myWorkSheet);
       Marshal.ReleaseComObject(mySheets);
       Marshal.ReleaseComObject(myWorkBook);
       Marshal.ReleaseComObject(myWorkBooks);

       // myExcel.Quit();
       Marshal.ReleaseComObject(myExcel);

       // object[,] を string[] に変換します
       string[] strValues = new string[values.Length];

       // 元の配列が 0 ベースの場合と 1 ベースの場合がありえるため、
       // GetLowerBound を利用して列挙しています。
       for (int x = values.GetLowerBound(0), i = -1; x <= values.GetUpperBound(0); x++)
       {
        for (int y = values.GetLowerBound(1); y <= values.GetUpperBound(1); y++, i++)
        {
         if (values[x, y] != null)
         {
          strValues[i] = values[x, y].ToString();
         }
        }
       }

       Console.WriteLine(strValues[0]);
       Console.WriteLine(strValues[1]);
       Console.WriteLine(strValues[2]);
       Console.WriteLine(strValues[3]);

       Console.ReadKey();
      }
     }
    }

    # 2 次元配列のまま LINQ 処理できるよう、拡張メソッドを用意しておいたほうが楽かも。
記事No.88223 のレス /過去ログ151より / 関連記事表示
削除チェック/

■88232  Re[1]: c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ WebSurfer -(2018/08/10(Fri) 13:59:54)
    No88223 (ユウタ さん) に返信
    > forを使わずにエクセルのセル範囲をstring型で1次配列に格納したいのですが、可能でしょうか。
    > (大量の値を格納するためforだと処理が遅くなるため高速化したいです)

    「セル範囲」というのが具体的にどういうことか分かってないので期待通りのことができるかどうか不明
    ですが、ADO.NET + ACE プロバイダを使うという手段はいかがですか。

    可能性の一つとして検討されてはいかがでしょう。
記事No.88223 のレス /過去ログ151より / 関連記事表示
削除チェック/

■88236  Re[2]: c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ ユウタ -(2018/08/11(Sat) 00:25:30)
    皆さん

    アドバイスありがとうございます。
    言葉足らずですみません、私が行いたいのは、
    セルA1〜A5000までの範囲を1次配列に格納するというものです。

    エクセルから取得したRangeに対して、
    forを使って各要素を1つ1つ1次配列に格納することは可能なのですが、
    やや時間がかかるため、ここも短縮したいという趣旨でした。

    また、なぜ1次配列かというと、
    配列の各要素の値をforを使って取得する場合、
    2次配列で取得するのと1次配列で取得するのでは、
    1次配列の方が圧倒的に速いためです。


    >furuさん
    myRangeは2次配列ですが、myRangeObjは1次配列に変換されたものとなります。


    >魔界の仮面騎士さん
    やはりforで配列に格納していく方法になるのですね。
    一発で変換する命令があればよいのですが…。

    >WebSurferさん
    ADO.NET + ACEプロバイダ
    初めて聞きましたので、調べてみます。
記事No.88223 のレス /過去ログ151より / 関連記事表示
削除チェック/

■88237  Re[3]: c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ 魔界の仮面弁士 -(2018/08/11(Sat) 02:36:08)
    No88236 (ユウタ さん) に返信
    > エクセルから取得したRangeに対して、
    > forを使って各要素を1つ1つ1次配列に格納することは可能なのですが、
    > やや時間がかかるため、ここも短縮したいという趣旨でした。

    速度面が問題になるなら、COM Interop な Excel オートメーションを用いるのではなく、
    ExcelDataReader や EPPlus を使う方法に変更してみるとか。


    ひとまず Excel オートメーションのままで実装するとした場合、
    先のように .Value で複数範囲を一括で読み取るようにすることで、
    アウトプロセスである Excel との通信回数が、その 1 回だけで済むようになります。

    そのため、繰り返し読みだす方法に比べれば大幅な高速化になります。

    これが C# ではなく、Excel VBA 内での読み取りであったのなら、
    繰り返し読み取るようにしても、そこまで遅くはならないのですけれども(インプロセスなので)。


    とはいえ一括読み取りの際に、対象セル数があまりに膨大になる場合は
    転送効率が急激に落ちることがあります。
    その場合は複数回のブロックに分けて読み取るようにします。
    (5000セル程度ならば通常は問題無いはず)


    > また、なぜ1次配列かというと、
    > 配列の各要素の値をforを使って取得する場合、
    > 2次配列で取得するのと1次配列で取得するのでは、
    > 1次配列の方が圧倒的に速いためです。


    1 次元化せずにそのまま 2 次元のまま扱うと、どの程度のタイムロスになるのですか?
    あるいは、2 次元配列から 1 次元配列への詰め替える場合、どの程度がかかるのでしょうか?

    1 次元配列は、IL レベルで専用命令(ldelem.*)が揃っていることもあり、
    確かに高速ではありますが、今回、そこまで“圧倒的”な差が付くのでしょうか。

    実際に測定したわけではないですが、個人的な経験から言えば、
    「Value で 2 次元配列にまとめて読み取る方法」と
    「1 セルずつ for で読み取る方法」との処理時間差に比べれば、
    『1 次元配列へのアクセス時間』と『2 次元配列へのアクセス時間』の時間差は
    相対的には小さいものであると思っているのですが…。


    > やはりforで配列に格納していく方法になるのですね。

    5000行×1列や 1行×5000列 といったパターンなら、
    for よりも foreach の方が楽ですね。


    > 一発で変換する命令があればよいのですが…。

    .Cast<>.ToArray() するという手はあります。
    詰め替えているという点では同じですが。


    // [0..3, 0..0] な object 型の 2 次元配列を
    object[,] obj2dArray = { { "AB" }, { 12.0 }, { null }, { DateTime.UtcNow } };

    // [0..3] な string 型の 1 次元配列に変換
    string[] str1dArray = obj2dArray.Cast<object>().Select(o => o != null ? o.ToString() : null).ToArray();



    // [1..5000, 1..1] な object 型の 2 次元配列を
    obj2dArray = (object[,])Array.CreateInstance(typeof(object), new int[] { 5000, 1 }, new int[] { 1, 1 });
    obj2dArray[1, 1] = "AB";
    obj2dArray[2, 1] = 12.0;
    obj2dArray[3, 1] = null;
    obj2dArray[4, 1] = DateTime.UtcNow;

    // [0..4999] な string 型の 1 次元配列に変換
    str1dArray = obj2dArray.Cast<object>().Select(o => o != null ? o.ToString() : null).ToArray();



    > >WebSurferさん
    > ADO.NET + ACEプロバイダ
    > 初めて聞きましたので、調べてみます。

    この方法だと、Excel が入っていない環境でも読み書きできるというメリットがあります。
    幾つかの制限はあるものの、要件次第では Excel オートメーションより高速な場合さえありますね。


    ただし取得される結果は DataTable もしくは DataReader になりますので、
    最終的に 1 次元配列であることを望むのであれば、
    やはり LINQ なり for/foreach なりでの詰め替えは必要ですね。


    あるいは
    ADO.NET + ACE プロバイダの代わりに、
    ADO + ACE プロバイダの組み合わせにすれば、
    ADODB.Recordset に受け取り、
     // object[,] array2D = recordset.GetRows();
     string[] strArray1D = recordset.GetString(ADODB.StringFormatEnum.adClipString, 5000, "\t", "\r\n").Split(new string[] { "\r\n" }, StringSplitOptions.None);
    のようにするという手が使えるかもしれません。
記事No.88223 のレス /過去ログ151より / 関連記事表示
削除チェック/

■88238  Re[4]: c# エクセルのセル範囲を1次配列に格納する方法
□投稿者/ ユウタ -(2018/08/11(Sat) 17:53:24)
    魔界の仮面弁士さん

    丁寧にありがとうございます。
    度々すみません、実際に私がやりたい処理としては、約39000行、6000列程のデータを扱うものとなります。
    (例示と実際が結構違ってすみません。。)

    行ごとに特定の値がある場合は、その付近の値を調べることを繰り返すため、
    なるべく早く処理をしたいというものです。

    提示いただいたコードなど、速度を見てみました。

    <処理内容>
    前提:セルA1〜A39000までに、文字列があるセルと空白セルがある。
    処理:セルA1〜A39000までの、文字列があるセルの個数をforでカウントする。

    @Range <格納> 2次配列 <変換> 1次配列 → 処理実行
    ・配列化:0.378秒
    ・処理 :0秒

    ARange <格納> 2次配列 → 処理実行
    ・配列化:0.362秒
    ・処理 :0.002秒

    BRange <for> 1次配列 → 処理実行
    ・配列化:41.652秒
    ・処理 :0.001秒

    CRange → 処理実行
    ・配列化:0.346秒(Rangeのみ)
    ・処理 :25.421秒

    DRange <変換> 1次配列 → 処理実行
    ・配列化:36.603秒
    ・処理 :0秒
     →ただし、文字認識できない


    結果として、
    ・エクセルのRangeをそのまま処理すると遅い
    ・1次配列・2次配列では、速度にさほど差はない
    ということでした。

    私が、圧倒的に速いと感じていたのは、エクセルのRangeでの処理速度と配列での処理速度の差でした。
    1次配列・2次配列においての速度は、誤差の範囲になるので、
    複数行・列を取得できる2次配列の方が利便性が高い場合もあると思いますので、
    適宜使い分けていこうと思います。

    ありがとうございました。
記事No.88223 のレス / END /過去ログ151より / 関連記事表示
削除チェック/

■102111  Re[1]: FullCarendarのイベントソース取得について
□投稿者/ WebSurfer -(2023/07/03(Mon) 13:26:37)
    No102101 (あああ さん) に返信
    
    ちょっと試してみました。
    
    No102107 で、
    
    >>var jsonString = JsonSerializer.Serialize(eventData, options);
    >>return Json(jsonString,JsonRequestBehavior.AllowGet);
    > 
    > 1 行目で System.Text.Json 名前空間の JsonSerializer クラスを使って JSON 文字列
    > にシリアライズして、それを 2 行目で MVC5 の Json メソッド (Newtonsoft.JSON を使
    > っているはず) でもう一回 JSON 文字列にシリアライズしています。何か意味があるの
    > ですか?
    > 
    > Fullcarendar は自分は触ったこともないの分かりませんが、渡すデータの形式 (特に
    > 日時) は仕様に合っているのでしょうか?
    
    と書きましたが、原因はやはりその 2 点のようです。
    
    どのように直せばいいかと言うと、前者については jsonString をそのまま以下のようにし
    て返せばいいです。
    
    // シリアライズ
    var jsonString = JsonSerializer.Serialize(eventData, options);
    
    Response.ContentType = "application/json; charset=utf-8";
    return Content(jsonString);
    
    後者については、魔界の仮面弁士さんが書かれたように、大文字小文字の問題です。
    質問者さんのコードで以下のところのコメントアウトを外せば小文字になります。
    
    // プロパティ名をキャメルケースに変換
    //PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    
    検証に使った GetEvents メソッドのコードを以下に載せておきます。
    
    public ActionResult GetEvents()
    {
        var eventData = new List<EventModel>
        {
            new EventModel
            {
                Id = "1",
                Title = "イベント",
                Start = new DateTime(2023,7,2,0,0,0),
                End = new DateTime(2023,7,3,0,0,0)
            },
            new EventModel
            {
                Id = "2",
                Title = "イベント",
                Start = new DateTime(2023,7,4,0,0,0),
                End = new DateTime(2023,7,5,0,0,0)
            }
        };
    
        // これは日付の JSON 文字列の形式が "\/Date(1688223600000)\/" になるのでダメ
        //return Json(model, JsonRequestBehavior.AllowGet);
    
        var options = new JsonSerializerOptions
        {
            // 日本語を変換するためのエンコード設定
            Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
    
            // プロパティ名をキャメルケースに変換
            PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
    
            // インデントを付ける
            WriteIndented = true
        };
    
        // シリアライズ
        var jsonString = JsonSerializer.Serialize(eventData, options);
    
        Response.ContentType = "application/json; charset=utf-8";
        return Content(jsonString);
    }
記事No.102101 のレス /過去ログ178より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -