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

C#の基本イディオムについてその5~ディクショナリ~

C#では、要素のまとまりをコレクションというが、その1つとして、ディクショナリという考え方があるので、それについてまとめた。 ディクショナリの宣言 ディクショナリは基本的に 「new Dictionary<(TKey)、(TValue)>」 の形式で書くこと。 var hashira = new Dictionary<string, string>() { { "水柱", "冨岡義勇" }, { "蟲柱", "誇張しのぶ" }, { "炎柱", "煉獄杏寿郎" }, { "音柱", "宇髄天元" }, { "恋柱", "甘露寺蜜璃" }, { "霞柱", "時透無一郎" }, { "蛇柱", "伊黒小芭内" }, { "風柱", "不死川実弥" }, { "岩柱", "悲鳴嶼行冥" }, }; foreach(var i in hashira) { Console.WriteLine(i.Key); // Keyで、Tkeyの値にアクセスできる Console.WriteLine(i.Value); // Valueで、TValueの値にアクセスできる } 今回の場合だと、i.Keyで「○柱」、i.Valueで柱の人の名前が取得できる。 また、ディクショナリはTValueの方にクラスを指定することもできる。 JoJoクラス public class Jojo { public string Name { get; set; } public int Part { get; set; } public Jojo(string name, int part) { Name = name; Part = part; } } 上記のようなJoJoクラスがあったとして、 var jojo = new Dictionary<string, Jojo>() { { "ファントムブラッド", new Jojo("ジョナサン・ジョースター", 1) }, { "戦闘潮流", new Jojo("ジョセフ・ジョースター", 2) }, { "スターダスト・クルセイダーズ", new Jojo("空条承太郎", 3) }, { "ダイヤモンドは砕けない", new Jojo("東方仗助", 4) }, { "黄金の風", new Jojo("ジョルノ・ジョバァーナ", 5) }, { "ストーンオーシャン", new Jojo("空条徐倫", 6) }, { "スティール・ボール・ラン", new Jojo("ジョニィ・ジョースター", 7) }, { "ジョジョリオン", new Jojo("東方定助", 8) }, }; とディクショナリを宣言することができる。 ディクショナリの操作 要素にアクセスする var giyu = hashira["水柱"]; // "冨岡義勇"にアクセスする var part3 = jojo["スターダスト・クルセイダーズ"]; // jojoクラスのインスタンスが取得できる 要素を追加する hashira["爪柱"] = "臥龍岡爪太郎"; jojo["岸辺露伴は動かない"] = new Jojo("岸辺露伴", 9); もしくは hashira.Add("爪柱", "臥龍岡爪太郎"); jojo.Add("岸辺露伴は動かない", new Jojo("岸辺露伴", 9)); 要素を追加するコレクションに既に存在しているキーを指定して追加した場合、例外(ArgumentException)が発生する。例外については別の記事でまとめる予定。 要素を削除する hashira.Remove("爪柱"); jojo.Remove("岸辺露伴は動かない"); 削除する場合、まず、ディクショナリに指定したキーがあるかどうかを判定する。 キーがあれば、Trueを返しつつ、要素が削除する。 キーがない場合は、Falseを返すだけ。 ディクショナリにもLINQを使うことができる。 LINQについては以下の記事にまとめてある。 (例1) var average = hashira.Where(el => el.Key == "炎柱").FirstOrDefault(); // ["炎柱", "煉獄杏寿郎"] (例2) var partSum = jojo.Sum(el => el.Value.Part); // 36 配列やリストをディクショナリに変換する。 配列やリストはディクショナリに変換することが可能。 Pokemonクラス class Pokemon { public string Name { get; set; } public string[] Types { get; set; } public Pokemon(string name, string[] types) { Name = name; Types = types; } } というポケモンクラスがあり、 var pokemons = new List<Pokemon>() { new Pokemon("カメックス", new string[]{ "みず" }), new Pokemon("ミミッキュ", new string[]{ "ゴースト", "フェアリー" }), new Pokemon("ガブリアス", new string[]{ "ドラゴン", "じめん" }), new Pokemon("ヤドキング", new string[]{ "みず", "エスパー" }), new Pokemon("キングドラ", new string[]{ "みず", "ドラゴン" }), new Pokemon("マフォクシー", new string[]{ "ほのお", "エスパー" }), new Pokemon("ドリュウズ", new string[]{ "じめん", "はがね" }), new Pokemon("エレキブル", new string[]{ "でんき" }), new Pokemon("ブーバーン", new string[]{ "ほのお" }), new Pokemon("ベトベトン", new string[]{ "どく" }), new Pokemon("ハッサム", new string[]{ "むし", "はがね" }), }; というList型のpokemonsという変数があったとする。 このpokemonsをToDictionaryメソッドに変換することができる。 pokemonsをディクショナリに変換 var poke = pokemons.ToDictionary(el => el.Name); foreach(var item in poke) { var type = "のタイプは,"; foreach (var item2 in item.Value.Types) { var check = type == "のタイプは," ? "," : ""; type = type + item2 + check; } var message = item.Key + type; Console.WriteLine(message); } 出力結果 カメックスのタイプは,みず, ミミッキュのタイプは,ゴースト,フェアリー ガブリアスのタイプは,ドラゴン,じめん ヤドキングのタイプは,みず,エスパー キングドラのタイプは,みず,ドラゴン マフォクシーのタイプは,ほのお,エスパー ドリュウズのタイプは,じめん,はがね エレキブルのタイプは,でんき, ブーバーンのタイプは,ほのお, ベトベトンのタイプは,どく, ハッサムのタイプは,むし,はがね 参考文献
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.NET 6 Preview 6をDocker上で動かしてみました。

はじめに Dockerの勉強として、先日リリースされた.NET 6 Preview 6をDocker上で動かしてみました。 Preview版のSDKをローカルにインストールするのは悩むなぁという方は参考になるかもしれません。 以下の記事がとても参考になりました。ありがとうございます!! https://qiita.com/karuakun/items/054701beed6cd925d7d2 Dockerコンテナ内でMVCプロジェクトを立てる! .NET 6 Preview 6のイメージを以下から取得し、コンテナを立ち上げます。 https://hub.docker.com/_/microsoft-dotnet-nightly-sdk/ ※今回はUbuntu環境のイメージを利用しました。 C:\Work\Docker_.Net6Preview>docker run -it -p 5000:5000 -v c:\Work\Docker_.Net6Preview:/src mcr.microsoft.com/dotnet/sdk:6.0-focal ※ポートは5000、ローカル環境のc:\Work\Docker_.Net6Previewフォルダをコンテナ内のsrcフォルダへマウントしています。 コンテナを立ち上げた後はsrcフォルダ内で以下のようにMVCプロジェクトを立ち上げてみます。 root@a5d31eefeda7:/# cd src root@a5d31eefeda7:/src# ls root@a5d31eefeda7:/src# mkdir WebSite1 root@a5d31eefeda7:/src# cd WebSite1/ root@a5d31eefeda7:/src/WebSite1# dotnet new mvc The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully. This template contains technologies from parties other than Microsoft, see https://aka.ms/aspnetcore/6.0-third-party-notices for details. Processing post-creation actions... Running 'dotnet restore' on /src/WebSite1/WebSite1.csproj... Determining projects to restore... Restored /src/WebSite1/WebSite1.csproj (in 69 ms). Restore succeeded. Restore succeededと出たので問題なく出来上がったようです。 dotnet runコマンドでMVCプロジェクトを実行してみましょう。 --urlsでURLとポートの形式を指定します。 root@a5d31eefeda7:/src/WebSite1# dotnet run --urls http://*:5000 Building... warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60] Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed. info: Microsoft.Hosting.Lifetime[14] Now listening on: http://[::]:5000 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /src/WebSite1 warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3] Failed to determine the https port for redirect. localhost:5000へアクセスしてみると・・・ お!しっかり表示されていますね!(^^)! 良い感じです。 コンテナを立ち上げる際にローカルフォルダへマウントしていますので、対象のフォルダからタイトルを変えてみましょう。 タイトルを「Welcome」→「Welcome変更しました」としてみました。 しっかり変わっていますね! .NET 6 Preview 6で追加されたコマンドも試してみる 以下の記事で.NET 6 Preview 6にて追加されたコマンドがあるようですのでその中の1つである「dotnet workload search」というコマンドを打ってみました。 https://devblogs.microsoft.com/dotnet/announcing-net-6-preview-6/ インストール可能なワークロードがいくつか出ていることが分かります。 root@a5d31eefeda7:/src/WebSite1# dotnet workload search Workload ID Description ----------------------------------------------------------------------------------------- microsoft-net-sdk-blazorwebassembly-aot Browser Runtime native performance tools microsoft-net-runtime-android Android Mono Runtime microsoft-net-runtime-android-aot Android Mono AOT Workload microsoft-net-runtime-ios iOS Mono Runtime and AOT Workload microsoft-net-runtime-maccatalyst MacCatalyst Mono Runtime and AOT Workload microsoft-net-runtime-tvos tvOS Mono Runtime and AOT Workload microsoft-net-runtime-mono-tooling Shared native build tooling for Mono runtime microsoft-android-sdk-full Android SDK microsoft-maccatalyst-sdk-full Microsoft MacCatalyst SDK maui .NET MAUI SDK for all platforms maui-mobile .NET MAUI SDK for Mobile maui-desktop .NET MAUI SDK for Desktop maui-core .NET MAUI SDK Core Packages maui-android .NET MAUI SDK for Android maui-maccatalyst .NET MAUI SDK for Mac Catalyst maui-ios .NET MAUI SDK for iOS maui-windows .NET MAUI SDK for Windows microsoft-macos-sdk-full Microsoft macOS SDK microsoft-ios-sdk-full Microsoft iOS SDK microsoft-tvos-sdk-full Microsoft tvOS SDK おわりに Dockerはこんな感じで簡単に環境が作れてしまうのでとても良いですね!(イメージが用意されてればではありますが・・・) 今まではローカルの方にインストールしまくっていたので今後は積極的に利用していかねば!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.NET 6 PreviewをDocker上で動かしてみました。

はじめに Dockerの勉強として、.NET 6 PreviewをDocker上で動かしてみました。 Preview版のSDKをローカルにインストールするのは悩むなぁという方は参考になるかもしれません。 以下の記事がとても参考になりました。ありがとうございます!! Dockerコンテナ内でMVCプロジェクトを立てる! .NET 6 Previewのイメージを以下から取得し、コンテナを立ち上げます。 https://hub.docker.com/_/microsoft-dotnet-nightly-sdk/ ※今回はUbuntu環境のイメージを利用しました。 C:\Work\Docker_.Net6Preview>docker run -it -p 5000:5000 -v c:\Work\Docker_.Net6Preview:/src mcr.microsoft.com/dotnet/sdk:6.0-focal ※ポートは5000、ローカル環境のc:\Work\Docker_.Net6Previewフォルダをコンテナ内のsrcフォルダへマウントしています。 コンテナを立ち上げた後はsrcフォルダ内で以下のようにMVCプロジェクトを立ち上げてみます。 root@a5d31eefeda7:/# cd src root@a5d31eefeda7:/src# ls root@a5d31eefeda7:/src# mkdir WebSite1 root@a5d31eefeda7:/src# cd WebSite1/ root@a5d31eefeda7:/src/WebSite1# dotnet new mvc The template "ASP.NET Core Web App (Model-View-Controller)" was created successfully. This template contains technologies from parties other than Microsoft, see https://aka.ms/aspnetcore/6.0-third-party-notices for details. Processing post-creation actions... Running 'dotnet restore' on /src/WebSite1/WebSite1.csproj... Determining projects to restore... Restored /src/WebSite1/WebSite1.csproj (in 69 ms). Restore succeeded. Restore succeededと出たので問題なく出来上がったようです。 dotnet runコマンドでMVCプロジェクトを実行してみましょう。 --urlsでURLとポートの形式を指定します。 root@a5d31eefeda7:/src/WebSite1# dotnet run --urls http://*:5000 Building... warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60] Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed. info: Microsoft.Hosting.Lifetime[14] Now listening on: http://[::]:5000 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /src/WebSite1 warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3] Failed to determine the https port for redirect. localhost:5000へアクセスしてみると・・・ お!しっかり表示されていますね!(^^)! 良い感じです。 コンテナを立ち上げる際にローカルフォルダへマウントしていますので、対象のフォルダからタイトルを変えてみましょう。 タイトルを「Welcome」→「Welcome変更しました」としてみました。 しっかり変わっていますね! .NET 6 Preview 6で追加されたコマンドも試してみる 現時点(この記事を書いた2021年7月27日)で最新のバージョンとなっている.NET 6 Preview 6について、以下の記事で追加されたコマンドがあるようですのでその中の1つである「dotnet workload search」というコマンドを打ってみました。 dotnet workload searchコマンドはインストール可能なワークロードを表示します。 以下のようにインストール可能なワークロードがいくつか出ていることが分かります。 (どうやらPreview6にも対応してるっぽいですね。) root@a5d31eefeda7:/src/WebSite1# dotnet workload search Workload ID Description ----------------------------------------------------------------------------------------- microsoft-net-sdk-blazorwebassembly-aot Browser Runtime native performance tools microsoft-net-runtime-android Android Mono Runtime microsoft-net-runtime-android-aot Android Mono AOT Workload microsoft-net-runtime-ios iOS Mono Runtime and AOT Workload microsoft-net-runtime-maccatalyst MacCatalyst Mono Runtime and AOT Workload microsoft-net-runtime-tvos tvOS Mono Runtime and AOT Workload microsoft-net-runtime-mono-tooling Shared native build tooling for Mono runtime microsoft-android-sdk-full Android SDK microsoft-maccatalyst-sdk-full Microsoft MacCatalyst SDK maui .NET MAUI SDK for all platforms maui-mobile .NET MAUI SDK for Mobile maui-desktop .NET MAUI SDK for Desktop maui-core .NET MAUI SDK Core Packages maui-android .NET MAUI SDK for Android maui-maccatalyst .NET MAUI SDK for Mac Catalyst maui-ios .NET MAUI SDK for iOS maui-windows .NET MAUI SDK for Windows microsoft-macos-sdk-full Microsoft macOS SDK microsoft-ios-sdk-full Microsoft iOS SDK microsoft-tvos-sdk-full Microsoft tvOS SDK おわりに Dockerはこんな感じで簡単に環境が作れてしまうのでとても良いですね!(イメージが用意されてればではありますが・・・) 今まではローカルの方にインストールしまくっていたので今後は積極的に利用していかねば!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IllustratorのCOMライブラリがWindows Updateで壊れる

以前から何度か遭遇していたのですが、特にこのことに関しての記事は無さそうだったので (Adobeのフォーラムに質問はありましたが…) 記事に書いておこうと思います。 何したら何が起こるの? FU(Feature Update)等の大型なWindowsUpdateをすると、IllustratorのCOMライブラリ(C#等のプログラムから操作できるようにするやつ)が壊れて使用できなくなる場合があります。 IllustratorのCOMライブラリって? VisualStudioなら「参照」→「参照の追加」→「COM」のところから追加できるこういうやつです。 Illustratorのバージョンごとに名前が違ったり、名前は同じでもライブラリのバージョンが違ったりします。 ※インストールしているバージョン分しか表示されません 壊れたらどうなるの? 壊れたら、今まで実行できていたプログラムでいきなり下記のエラーが表示されます。 型 'System.__ComObject' の COM オブジェクトをインターフェイス型 'Illustrator.Application' にキャストできません。IID '{95CD20AA-AD72-11D3-B086-0010A4F5C335}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外:0x80004002 (E_NOINTERFACE))。 正直エラーだけ見ても、「どないしたらええねん」状態になります。 初めて遭遇した時は何が悪いのかわからず、解決にめちゃめちゃ時間かかりました… 解決方法は? ぶっちゃけ無いに等しいです!! 下記以外の解決方法があればドシドシ教えて欲しいです!! 今の所、私がわかっている解決方法は、 Illustratorをアンインストールし、再度Illustratorをインストールすることです。 そうすると、先ほどのエラーは解消します。 COMライブラリが正しくインストールし直されるんでしょう。 わかってればなんてこと無いのですが、再インストールもそこそこ時間かかるので、出来ればそれ以外の解決方法が知りたいところです。 注意点 再インストールすれば解消しますが、今はAdobeの方針で 最新版と1つ前のバージョンしかインストールできないようになっているので 例えば今IllustratorCC2019が入っていて、それが壊れたとしてアンインストールしてしまうと 今は最新のIllustrator2021と、1つ前のIllustrator2020しかインストールできません! バージョンが変わってしまうと色々と問題が起こったりする場合があるので 変えたくない時もあるのですが、強制で変えないといけなくなります。。。 実際にこういう問題があったりします。 それでは!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IDisposable --メモ--

Dispose パターン class Program { //Dispose(bool disposing) 呼び出し回数チェック用 public static int i = 1; public static void Main() { var ds = new DisposeSample(); WriteLine("new DisposeSample()"); WriteLine("Dispose()実行します。"); ds.Dispose(); WriteLine("Dispose()をもう一度実行します。"); ds.Dispose(); } public class DisposeSample : IDisposable { // Dispose(bool disposing)を少なくとも1回呼び出したか //重複での呼び出し防止 private bool disposedValue = false; protected virtual void Dispose(bool disposing) { Console.WriteLine("Dispose呼び出し:"+ i++ +"回目"); ; if (!disposedValue) { if (disposing) { // マネージ リソースを ここで解放 WriteLine("■マネージ リソースを ここで解放。"); } // アンマネージリソース ここで解放する。 WriteLine("■アンマネージリソース ここで解放。"); disposedValue = true; } } // ファイナライザ ( デストラクタ ) ~DisposeSample() { //アンマネージ リソース を明示的に解放 //Dispose()を一度呼んでいれば //マネージ リソース は解放済み のはず Dispose(false); } // このコードは、破棄可能なパターンを正しく実装できるように追加されました。 public void Dispose() { //マネージ リソース を明示的に解放 //アンマネージも ついでに? 解放 Dispose(true); //ファイナライザを抑止 GC.SuppressFinalize(this); } } } 参考 確保したリソースを忘れずに解放するには?
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

多種類対応のオブジェクトプールを作る。

Unityにおいてかなりよく使われると思われるObjectPool。 私もかなりこれのお世話になりました、というか現在進行形でなっています。 ある時、私は沢山の種類のObjectPoolを必要としました。 でも大量に宣言するの面倒くさいしコード見づらい... そこからかくかくしかじかあって多種類対応のObjectPoolを作りました。 私と同じ様なものを求めているかつての私みたいな人達のため、 それを残しておきたいと思います。 コード using System.Collections; using System.Collections.Generic; using UnityEngine; public class MultiType_ObjPool : MonoBehaviour { public List<GameObject> PrefabList = new List<GameObject>(); public Dictionary<string,Stack<GameObject>> ObjPoolDic = new Dictionary<string,Stack<GameObject>>(); public List<GameObject> EnableObjList = new List<GameObject>(); public int AddCount;//足りない時に追加で生成する数 public void Register(string name,int count){//登録 GameObject regist = PrefabList.Find(x => x.name == name); if(!ObjPoolDic.ContainsKey(regist.name)){ ObjPoolDic.Add(regist.name,new Stack<GameObject>()); } for(int a = 0;a<count;a++){ GameObject pObj = Instantiate(regist); pObj.SetActive(false); ObjPoolDic[regist.name].Push(pObj); } } public GameObject Create(string name){//生成 if(!ObjPoolDic.ContainsKey(name)){ Register(name,AddCount); } GameObject returnobj = ObjPoolDic[name].Pop(); returnobj.SetActive(true); EnableObjList.Add(returnobj); return returnobj; } public void Sleep(GameObject sobj){//使い終わった後の処理 sobj.SetActive(false); EnableObjList.Remove(sobj); ObjPoolDic[sobj.name].Push(sobj); } } 動作説明 Dictionaryを使って様々な種類のオブジェクトプールを取得する仕組みです。 Stackを使用することで軽量化を図っています。 アクティブなオブジェクトを別でListに入れているのでそこから様々な処理を出来ます。 補足 ・一応このスクリプトは勝手に使ってもらってOKです! ・初記事などで読みづらい部分があると思います、許してください。 ・質問とか(もしよければLGTMも)ジャンジャンください!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む