20200527のC#に関する記事は6件です。

C# グラフの値をCSVで保存する

using

using System.IO; //Save
using System.Text; //Save

Body

private void btnSave_Click(object sender, EventArgs e)
{
try
{
//ファイル書き込み形式(上書き)
StreamWriter file = new StreamWriter(str_save_file, false, Encoding.UTF8);
for (int i= 0; i < chart1.Series[str_ms_x].Points.Count; i++) {
file.WriteLine( chart1.Series[str_ms_x].Points[i].YValues[0] + "," + chart1.Series[str_ms_y].Points[i].YValues[0] );
}
file.Close();
//セーブボタン使用不可
btnSave.Enabled = false;
}
catch
{

        }
    }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Microsoft] Angular側からBlazorを眺めて比較する

Blazorが一般公開になりました。
身の回りでは(大いなる誤解含みで)にわかに話題になっています。
自分はAngularが好きなので、AngularでできることがBlazorだとどうなるのかを調べてみたいと思います。

コンポーネント

Angularのコンポーネントと、Blazorのコンポーネントはほぼほぼ同じ意味です。
コンポーネントを用意していくことで画面を組み立てます。

思いついたものをまとめました。

比較項目 Angular Blazor
コンポーネントを構成するもの クラス、テンプレートHTML、(必要に応じて)スタイルシート Razorファイルひとつ
コンポーネント専用のスタイルシート 持てる 持てない1
他コンポーネントからの参照 <app-foo></app-foo>のようなタグで参照できます <Foo></Foo>のようなタグで参照できます
値のバインディング テンプレート中に{{foo}}と書くことで、変数を参照できます テンプレート中に@fooと書くことで、変数を参照できます
フォームとのバインディング タグに[(ngModel)]をつけます。あるいはリアクティブフォームを使います タグに @bind 属性をつけます
ライフサイクル 画面遷移時にインスタンスが生成/破棄される ← 同左(?)
スタイルシート SCSS、CSSが使えます 別途設定しない場合はCSSのみ(?)

フォームと入力バリデーション

Angularの場合

タグに属性をつけたり(テンプレート駆動の場合)、FormGroupを使ったり(リアクティブフォームの場合)することで、Valid/Invalidな状態になります。

Blazorの場合

バインディングした変数にアノテーションをつけることで、その入力項目を持つフォーム全体がValid/Invalidな状態になります。

テンプレートで使用できる制御構文

Angularの場合

  • If
  • Forループ
  • Switch Case

Blazorの場合

RazorはそのままC#を書けますので、C#と一緒です。

コンポーネント間におけるデータの共有

Angularの場合

サービスクラスを作り、コンポーネントヘインジェクトします。

Blazorの場合

好みのクラスを作り、DIコンテナへシングルトンとして登録します。
コンポーネントに @inject と書くことでインジェクトできます。

ルーティング

Angularの場合

ルーティング情報専用のモジュールクラスを作成し、パスとコンポーネントの組み合わせをRouterModuleへ渡します。

Blazorの場合

コンポーネントの先頭に置いた @page でパスを指定します。

ディレクティブ

Angularには、HTMLタグにつけることで、その要素に対して特別な機能を付与できるディレクティブという機能があります。

Blazorには、同じようなものはないようです。2

定番サードパーティライブラリ

ライブラリ Angular Blazor
テスト Karma, Jasmine, Spectator 等 xUnit 等
状態管理 NGRX, Akita 等 (?)
マテリアルデザイン Angular Material 等 (?)

感想

Blazorは、機能が少なく単純なため、学習コストは低そうです。

@ の書き方がなかなかのカオスっぷりで、なんというかMicrosoftらしいなぁと感じます。

日本のSEが大好きなグリッドコントロールが、いくつもサードパーティ34から出ています。すぐに使えそうですね。

参考リンク

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.NET FrameworkとMonoの関係

Mono
Ecma標準に準じた.NET Framework互換の環境を実現するためのオープンソースのソフトウェア群やプロジェクト名。
2018年3月現在、マイクロソフトの子会社Xamarinと.NET Foundationが開発・販売・サポートを行う。
共通言語基盤(CLI)の実装やC#のコンパイラなどが含まれる。

Monoランタイム
多くのプロセッサで動作するJITコンパイラを搭載。
JITコンパイラはアプリケーション実行中に共通中間言語(CLI)コードをネイティブコードに変換しそれを転送する。

MonoTouch Framwork

iOSのAPIにアクセスするためのクラスライブラリ。
Objective-Cで作られたネイティブライブラリを直接アクセスするためにバインドされています。

Xamarin
2011年5月、Mono、MonoTouch、Mono for Androidの開発者により設立された企業。
これら3つのソフトウェアは共通言語基盤並びに共通言語仕様のクロスプラットフォームな実装。
作成できるアプリケーション
・Monowoを利用したアプリケーション、クラスライブラリ
・iOSアプリ
・Androidアプリ
・macOSアプリ
・複数のプラットフォームで再利用可能なクラスライブラリ(.NET StandartやPCL)

クロスプラットフォーム(マルチプラットフォーム)
異なるプラットフォーム上で、同じ仕様のものを動かすことができるプログラムの事。

Ecma標準
⇒情報通信システムの分野における国際的な標準化団体。
対応規格は国際標準化機構・国際電気標準会議の第一合同技術委員会が定める規格、
欧州電気通信標準化機構が定める規格(ETSI)、日本産業規格(JIS)がある。

参考資料

・Wikipedia
・C#によるiOS,Android,Windowsアプリケーション開発入門

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#のカラースキームをVisual Studio 2019以前のものからと切り替える

概要

Visual Studio 2020 16.4.0以前から16.4.0にアップデートした際、使用していたC#のカラースキームが以前のものに戻った。
この記事ではそれの対処法も兼ね、Visual StudioにおいてのC#のカラースキームの変更方法を記した。

方法

テキスト エディター→C#→詳細タブの、エディターの配色のドロップダウンより変更可能。
image.png

Visual Studio 2017の場合:
image.png

Visual Studio 2019の場合:
image.png
となる。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# XMLファイルから特定の要素を一括取得する

やりたいこと

次のようなXMLファイルから、animalsやfishesなどを無視して、nameタグで囲われた要素を一括で取得したいとします。
この場合、Descendantsメソッドが使用できます。

test.xml
<?xml version="1.0" encoding="utf-8"?>
<example>
    <animals>
        <animal>
            <name>cat</name>
        </animal>
        <animal>
            <name>dog</name>
        </animal>
    </animals>
    <fishes>
        <fish>
            <name>tuna</name>
        </fish>
        <fish>
            <name>salmon</name>
        </fish>
    </fishes>
</example>

次のコードのように、Descendants("name")とすることで、XMLの子孫要素からnameを検索し、IEnumerable<XElement>として一括取得できます。

Program.cs
using System;
using System.Collections.Generic;
using System.Xml.Linq;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(@"test.xml");
            IEnumerable<XElement> elems = doc.Descendants("name");
            foreach (XElement elem in elems)
            {
                Console.WriteLine(elem.Value);
            }
        }
    }
}

上記のコードは、取得したあとにforeachで各要素をコンソールに出力しています。出力結果は次のようになります。

cat
dog
tuna
salmon

参考

公式ドキュメント
https://docs.microsoft.com/ja-jp/dotnet/api/system.xml.linq.xcontainer.descendants?view=netcore-3.1#moniker-applies-to

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C# 勉強 JSONシリアル化

Program.cs
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization.Json;
using System.Text;
using System.Threading.Tasks;

namespace List1231{
    class Program{
        static void Main(string[] args){

            var novels = new Novel[] {
              new Novel {
                Author = "吉川英治",
                Title = "宮本武蔵",
                Published = 1939,
              },
              new Novel {
                Author = "吉川英治",
                Title = "三国志",
                Published = 1940,
              },
            };
            using (var stream = new FileStream("novels.json", FileMode.Create,
                                                FileAccess.Write)) {
                var serializer = new DataContractJsonSerializer(novels.GetType());
                serializer.WriteObject(stream, novels);
            }

            var lines = File.ReadLines("novels.json");
            foreach (var line in lines)
                Console.WriteLine(line);

        }
    }
}

クラス

Novel.cs
using System.Runtime.Serialization;

namespace List1231{
    [DataContract(Name="novel")]
    public class Novel{
        [DataMember(Name="title")]
        public string Title {get;set;}

        [DataMember(Name="author")]
        public string Author {get;set;}

        [DataMember(Name="published")]
        public int Published {get;set;}

        public override string ToString(){
            return string.Format("Title={0},Author={1},Published=[2]",
                Title,Author,Published);
        }
    }
}
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む