- 投稿日:2020-05-27T22:49:28+09:00
C# グラフの値をCSVで保存する
using
using System.IO; //Save
using System.Text; //SaveBody
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
{} }
- 投稿日:2020-05-27T22:16:57+09:00
[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から出ています。すぐに使えそうですね。
参考リンク
- 投稿日:2020-05-27T21:06:27+09:00
.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アプリケーション開発入門
- 投稿日:2020-05-27T20:38:35+09:00
C#のカラースキームをVisual Studio 2019以前のものからと切り替える
- 投稿日:2020-05-27T16:56:52+09:00
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.csusing 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参考
- 投稿日:2020-05-27T01:10:12+09:00
C# 勉強 JSONシリアル化
Program.csusing 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.csusing 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); } } }