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

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

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

全過去ログを検索

<< 0 >>
■30273  Re[1]: UserControlをツールボックスに表示させたくない
□投稿者/ やじゅ -(2008/12/19(Fri) 19:18:36)
>
記事No.30272 のレス /過去ログ54より / 関連記事表示
削除チェック/

■81916  Linqで2次元配列を作る
□投稿者/ ヒデオ -(2016/11/23(Wed) 07:42:17)

    分類:[C#] 

    C#で2次元配列を作る方法はありますか?
    最近Linqの勉強を始めました。ふとできるかな?と思ってやってみたのですが、できなかったので方法があるのか気になってしまったので質問させていただきます。

    int[] array = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
    int[,] array2 = new int[3, 5];

    arrayの配列をarray2の2次元配列にLinqで代入することはできますか?今の私だと二重ループを回して代入してしまうのでもう少しモダンな書き方があればと思ってます。
    なるべくint型が望ましいのですが、arrayがvarになってしまっても構いません。

    よろしくお願いします。
親記事 /過去ログ139より / 関連記事表示
削除チェック/

■81918  Re[1]: Linqで2次元配列を作る
□投稿者/ Hongliang -(2016/11/23(Wed) 09:56:45)
    そもそも多次元配列自体がモダンでは無いと判断されているようで、Linqと多次元配列はほとんど噛み合わないです。

    > なるべくint型が望ましいのですが、arrayがvarになってしまっても構いません。
    varは型ではありません。単なる型名の省略記法です。
    var array = new int[] { 1, 2, 3 };
    とVisual Studioで書いた時に、varのところにマウスオーバーすればarrayの型がツールチップで表示されます。
記事No.81916 のレス /過去ログ139より / 関連記事表示
削除チェック/

■81917  Re[1]: Linqで2次元配列を作る
□投稿者/ 魔界の仮面弁士 -(2016/11/23(Wed) 09:45:00)
    2016/11/23(Wed) 09:55:37 編集(投稿者)

    No81916 (ヒデオ さん) に返信
    > C#で2次元配列を作る方法はありますか?

    int[,] ary = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };


    > 最近Linqの勉強を始めました。

    二次元配列に対する、どのような LINQ 処理を求めているのかにもよりますが、
    二次元配列は IEnumerable<> を実装していないので、
    System.Linq.Enumerable 系のものは殆ど使えません。

    二次元配列に対しても、.Cast<> や .OfType<> などを使えますが、
    一次元配列に比べると、事前に用意されている拡張メソッドは少ないです。


    二次元配列を使うことが多いのであれば、Index を付与して
    平坦化するような拡張メソッドを用意しておくと便利かと思います。

    http://blog.xin9le.net/entry/2016/02/17/003605
    http://yasuand.hatenablog.com/entry/2014/02/01/165637
記事No.81916 のレス /過去ログ139より / 関連記事表示
削除チェック/

■81919  Re[2]: Linqで2次元配列を作る
□投稿者/ ヒデオ -(2016/11/23(Wed) 20:35:52)
    ご意見ありがとうございました。

    自分ではToArrayを使って配列に3回変える方法で決着させました。
    ありがとうございました。
記事No.81916 のレス / END /過去ログ139より / 関連記事表示
削除チェック/

■87808  Re[3]: クラスの2次元配列を生成する方法
□投稿者/ 魔界の仮面弁士 -(2018/07/01(Sun) 20:30:09)
    No87801 (ひげそり さん) に返信
    > 自作された多次元配列向けの拡張メソッドが

    今回の目的は、「二次元配列を生成する」ことでしたよね。であれば、
    戻り値が『As 型(,)』になるメソッドを用意するだけで、簡単に自作できるはずでは…?

    実装は拡張メソッドでも静的メソッドでもインスタンスメソッドでも OK ですし、
    ジェネリックにするかどうかも任意です。引数の渡し方も自分で決められます。
    手順的には、作成したメソッドの中で、ReDim ⇒ループ処理で生成⇒結果を Return
    というだけの処理で、そう難しくは無いと思うのですが。


    正直なところ、2次元配列は LINQ との相性が悪すぎますし、
    ジャグ配列等に切り替えた方が良いとは思うのですが、どうしても 2 次元配列を
    使う必要があるのなら、多次元配列向けの LINQ 実装の例について、過去ログの
    No81916 から始まるスレッドで述べられているので、参考にしてみてください。
記事No.87799 のレス /過去ログ151より / 関連記事表示
削除チェック/

■99455  Re[4]: フラグが変化したときに発生するイベントを作りたい
□投稿者/ 魔界の仮面弁士 -(2022/04/13(Wed) 12:06:01)
    No99451 (あいす さん) に返信
    > フラグをForm1以外でも変更し、

    そのフラグを Form1 で管理しているのなら、
    Form1.cs で internal あるいは public で公開すれば、
    他のフォームからでも、Form1のインスタンスのメンバーとして変更できるようになります。

    Form1 のインスタンスメンバーとしたいのではなく、
    プロジェクト全体で単一的に使う物なら、Program.cs で public static にしておけば、
    Program.何某〜〜 としてアクセスできます。
    あるいはシングルトンクラスを用意するということも出来るでしょう。


    アプリケーション設定、たとえば
     Properties.Settings.Default.MyFlag = "何某";
    などを使っているのであれば、さらに話は簡単で、
    PropertyChanged イベントがそのまま変更通知として使えるので
    自分でイベントを自作する必要すらありません。

    [STAThread]
    static void Main()
    {
      Properties.Settings.Default.PropertyChanged += (sender, e) =>
      {
        System.Diagnostics.Debug.WriteLine("{0}:{1}", e.PropertyName, Properties.Settings.Default[e.PropertyName]);
        if (e.PropertyName == "MyFlag")
        {
          MessageBox.Show("MyFlagが変更された");
        }
      };
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }



    > 変更したいファイルで TestClass testClass; を宣言し
    > testClass.TestFlag = true;にしてもlabelが変わらなかったので、、

    kiku さんのサンプルで言うと、
     public partial class Form1 : Form
     {
       private TestClass testClass;
     }
    という状態になっているので、Form1 以外からは操作できません。


    (案1) アクセス修飾子を、private から internal に格上げする
     public partial class Form1 : Form
     {
       internal readonly TestClass testClass = new TestClass();
     }


    (案2) インスタンスそのものは公開せず、フラグ操作部だけを公開する
     public partial class Form1 : Form
     {
       private readonly TestClass testClass = new TestClass();
       public void ChangeFlag(bool newValue)
       {
         testClass.TestFlag = newValue;
       }
     }

    Form1 のインタンス メンバーを別フォームからアクセスしたい場合は、
    Form1 から他フォームを開く際に、Form1 の this を他フォームに受け渡しておくのが
    手っ取り早いでしょう。(たとえば Owner プロパティに渡すこともできます)。

    あるいは、Application.OpenForms を通じて動的に取得するということもできます。
記事No.99448 のレス /過去ログ173より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -