20210510のC#に関する記事は5件です。

.NET のコレクションついて再認識する

.NETのコレクションに関するおさらい .NETでは、用途に応じた様々なコレクションクラスが用意されています。 .NETの進化に合わせて、追加されたクラスやインターフェイスもありますが、まとまった知識として追い切れていませんでした。 そこで、.NET5.0(C#9)となった現在(2021年5月)、改めて.NETのコレクションについておさらいしてみたいと思います。 ※今回は、必要な情報にたどり着くためのインデックス的なページとしました。 個々のトピックについては、今後個別に取り上げていきたいと思います。 (次回予定)コレクションの比較(IComparer<T>、IEqualityComparer<T>)について System.Collections から始まる名前空間 ここでは、System.Collectionsで始まる名前空間について、定義されている主要なインターフェイスとクラスについて確認します。 System.Collections 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections?view=net-5.0 リスト、キュー、ビット配列、ハッシュ テーブル、ディクショナリなど、オブジェクトのさまざまなコレクションを定義するインターフェイスとクラスが含まれています。 こちらは、互換性のためだけに残っている遺物です。 可能な限りSystem.Collections.Generic名前空間のコレクションを利用するようにしましょう。 System.Collections.Generic 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic?view=net-5.0 ジェネリック コレクションを定義するインターフェイスとクラスが含まれています。このコレクションを使用することにより、ユーザーは、汎用的でない厳密に型指定されたコレクションに比べてタイプ セーフでパフォーマンスが高い、厳密に型指定されたコレクションを作成できるようになります。 ここでは、コレクションを操作するためのインターフェイスと、基本的なコレクションクラス群が定義されています。 要素の比較をサポートするインターフェイス コレクションの並び替えや、要素の同値性を調べる際に利用するインターフェースが定義されています。 インターフェイス 説明 IEqualityComparer<T> オブジェクトの等価比較をサポートするメソッドを定義します。 IComparer<T> 2 つのオブジェクトを比較するために型が実装するメソッドを定義します。 イテレーションを提供するインターフェイス 主にforeach 文をサポートするためのインターフェイス IEnumerable<T> と IEnumerator<T>が定義されています。 また、LINQ to Object の拡張メソッド群は IEnumerable<T> のメソッドとして定義されています。 C#8.0からは、非同期foreachをサポートするためのインターフェイス IAsyncEnumerable<T> と IAsyncEnumerator<T> が追加されています。 非同期ストリームの生成と使用 | Microsoft Docs インターフェイス 説明 IEnumerable<T> 指定した型のコレクションに対する単純な反復処理をサポートする列挙子を公開します。 IEnumerator<T> ジェネリック コレクションに対する単純な反復処理をサポートします。 IAsyncEnumerable<T> 指定した型の値に対して非同期イテレーションを提供する列挙子を公開します。 IAsyncEnumerator<T> ジェネリック コレクションに対する単純な非同期イテレーションをサポートします。 各種コレクションを表現するインターフェイス IList<T>やIDictionary<TKey,TValue>など、コレクションの基本的な操作を行うインターフェイスが定義されています。 また、IReadOnlyCollection<T>などの読み取り専用コレクションを表すインターフェイスも定義されています。 インターフェイス 説明 ICollection<T> ジェネリック コレクションを操作するメソッドを定義します。 IDictionary<TKey,TValue> キーと値のペアのジェネリック コレクションを表します。 IList<T> インデックスによって個別にアクセスできるオブジェクトのコレクションを表します。 ISet<T> セットの抽象化のための基底インターフェイスを提供します。 IReadOnlyCollection<T> 要素の厳密に型指定された読み取り専用のコレクションを表します。 IReadOnlyDictionary<TKey,TValue> キーと値のペアの読み取り専用ジェネリック コレクションを表します。 IReadOnlyList<T> インデックスによってアクセスできる要素の読み取り専用コレクションを表します。 IReadOnlySet<T> セットの読み取り専用の抽象化を提供します。 要素の比較をサポートするクラス 要素の比較をサポートするIComparer<T>、IEqualityComparer<T>を実装する基本クラスが定義されています。 クラス 説明 Comparer<T> IComparer<T> ジェネリック インターフェイスの実装のための基本クラスを提供します。 ReferenceEqualityComparer 2 つのオブジェクト インスタンスを比較するときに、値の等価性 (Equals(Object)) ではなく参照の等価性 (ReferenceEquals(Object, Object)) を使用する IEqualityComparer<T>。 EqualityComparer<T> IEqualityComparer<T> ジェネリック インターフェイスの実装のための基本クラスを提供します。 コレクションクラス 基本的なコレクションのクラスが定義されています。 クラス 説明 Dictionary<TKey,TValue> キーと値のコレクションを表します。 HashSet<T> 値のセットを表します。 LinkedList<T> ダブルリンク リストを表します。 List<T> インデックスを使用してアクセスできる、厳密に型指定されたオブジェクトのリストを表します。 リストの検索、並べ替え、および操作のためのメソッドを提供します。 Queue<T> オブジェクトの先入れ先出しコレクションを表します。 Stack<T> 指定した同じ型のインスタンスの、後入れ先出し (LIFO) の可変サイズのコレクションを表しま SortedDictionary<TKey,TValue> キーに基づいて並べ替えられた、キーと値のペアのコレクションを表します。 SortedList<TKey,TValue> 関連付けられた IComparer<T> 実装に基づいて、キーにより並べ替えられた、キーと値のペアのコレクションを表します。 SortedSet<T> 一定の並べ替え順序で管理されたオブジェクトのコレクションを表します。 System.Collections.ObjectModel 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel?view=net-5.0 再利用可能なライブラリのオブジェクト モデル内のコレクションとして使用できるクラスが含まれています。 これらのクラスは、プロパティまたはメソッドがコレクションを返す場合に使用します。 コレクションクラスの基本クラスや、読み取り専用コレクションのクラスが定義されています。 プロパティやメソッドなどでコレクションを外部に公開する際にこれらのクラスを利用します。 クラス クラス 説明 Collection<T> ジェネリック コレクションの基本クラスを提供します。 KeyedCollection<TKey,TItem> キーが値に埋め込まれているコレクションの抽象基本クラスを提供します。 ObservableCollection<T> 項目が追加または削除されたとき、あるいはリスト全体が更新されたときに通知を行う動的なデータ コレクションを表します。 ReadOnlyCollection<T> 読み取り専用のジェネリック コレクションの基本クラスです。 ReadOnlyDictionary<TKey,TValue> キーと値のペアの読み取り専用ジェネリック コレクションを表します。 ReadOnlyObservableCollection<T> 読み取り専用の ObservableCollection<T> を表します。 System.Collections.Concurrent 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.concurrent?view=net-5.0 スレッド セーフなコレクション クラスがいくつか用意されています。複数のスレッドがコレクションに同時にアクセスするときは必ず、これらのコレクション クラスを System.Collections 名前空間および System.Collections.Generic 名前空間の対応する型の代わりに使用する必要があります。 ただし、拡張メソッドや明示的なインターフェイスの実装を介したコレクション オブジェクトの要素へのアクセスは、スレッドセーフであるという保証はなく、呼び出し元による同期が必要になる場合があります。 複数スレッドから同時にアクセス可能なコレクションが定義されています。 Producer-Consumer パターンの実装をサポートするBlockngCollection<T> や、タスク並列処理に用いられるPartitoner<T>などがあります。 .NET での並列プログラミング | Microsoft Docs BlockingCollection クラス | Microsoft Docs クラス クラス 説明 BlockingCollection<T> IProducerConsumerCollection<T> を実装するスレッド セーフなコレクションに、ブロッキングと範囲指定の機能を提供します。 ConcurrentBag<T> オブジェクトの順序付けられていないスレッド セーフなコレクションを表します。 ConcurrentDictionary<TKey,TValue> 同時に複数のスレッドからアクセスできる、スレッド セーフなキーと値のペアのコレクションを表します。 ConcurrentQueue<T> スレッド セーフな先入れ先出し (FIFO) コレクションを表します。 ConcurrentStack<T> スレッド セーフな後入れ先出し (LIFO) コレクションを表します。 OrderablePartitioner<TSource> 並べ替え可能なデータ ソースを複数のパーティションに分割する特定の方法を表します。 Partitioner 配列、リスト、および列挙体に使用できる共通のパーティション方法を提供します。 Partitioner<TSource> データ ソースを複数のパーティションに分割する特定の方法を表します。 インターフェース インターフェイス 説明 IProducerConsumerCollection プロデューサーまたはコンシューマーが使用するためのスレッド セーフなコレクションを操作するメソッドを定義します。 このインスタンスには、プロデューサー/コンシューマー コレクションの統一された表現が用意されています。BlockingCollection のような高度な抽象化では、基になるストレージ機構としてこのコレクションを使用できます。 System.Collections.Immutable 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.immutable?view=net-5.0 変更できないコレクションを定義するインターフェイスとクラスが含まれます。 変更できないコレクションを使用すると、以下のことができます。 ・ コレクションが変更されないことをコンシューマーが確実に保証できるように、コレクションを共有します。 ・ マルチスレッド アプリケーションで暗黙的なスレッド セーフを提供します (コレクションにアクセスするためにロックは不要)。 ・ 関数型プログラミングの方法に従います。 ・ 元のコレクションを維持しながら、列挙中にコレクションを変更します。 インターフェイス インターフェイス 説明 IImmutableDictionary<TKey,TValue> キーと値のペアの変更できないコレクションを表します。 IImmutableList<T> 変更できない要素のリストを表します。 IImmutableQueue<T> オブジェクトの変更できない先入れ先出しコレクションを表します。 IImmutableSet<T> セットの新しいインスタンスを作成することによってのみ変更可能な要素のセットを表します。 IImmutableStack<T> 変更できない後入れ先出し (LIFO) コレクションを表します。 クラス クラス 説明 ImmutableArray 変更できない配列を作成するためのメソッドを提供します。つまり、この配列は、作成後に変更することができません。 ImmutableArray<T>.Builder 余分なメモリを割り当てずに ImmutableArray<T> インスタンスに変換できる書き込み可能な配列アクセサー。 ImmutableDictionary ImmutableDictionary<TKey,TValue> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableDictionary<TKey,TValue>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できないハッシュ マップのインスタンス上で非常に効率よく生成またはビルドできるハッシュ マップを表します。 ImmutableDictionary<TKey,TValue> 変更できない、順序指定されていないキーと値のコレクションを表します。 ImmutableHashSet ImmutableHashSet<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableHashSet<T>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できないハッシュ セットのインスタンス上で非常に効率よく生成またはビルドできるハッシュ セットを表します。 ImmutableHashSet<T> 変更できない、順序が指定されていないハッシュ セットを表します。 ImmutableInterlocked 変更できないコレクションのインタロック交換メカニズムが含まれています。 ImmutableList ImmutableList<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableList<T>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できないリストのインスタンス上で非常に効率よく生成またはビルドできるリストを表します。 ImmutableList<T> 変更できないリスト (インデックスを使用してアクセスできる、厳密に型指定されたオブジェクトのリスト) を表します。 ImmutableQueue ImmutableQueue<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableQueue<T> 変更できないキューを表します。 ImmutableSortedDictionary ImmutableSortedDictionary<TKey,TValue> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableSortedDictionary<TKey,TValue>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できない並べ替えられたディクショナリのインスタンス上で非常に効率よく生成またはビルドできる、並べ替えられたディクショナリを表します。 ImmutableSortedDictionary<TKey,TValue> 変更できない並べ替えられたディクショナリを表します。 ImmutableSortedSet ImmutableSortedSet<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableSortedSet<T>.Builder メモリの割り当てをほとんどまたはまったく伴わずに変更が可能な並べ替えられたセットを表し、変更できない並べ替えられたセットを効率的に操作または構築します。 ImmutableSortedSet<T> 変更できない並べ替えられたセットの実装を表します。 ImmutableStack ImmutableStack<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableStack<T> 変更できないスタックを表します。 .NET(C#)のコレクションに関連する公式ドキュメント Microsoftの公式ドキュメントには、コレクションに関する様々な情報が記載されています。 特定のトピックについて詳しく踏み込んだ情報なども記載されていますので、一度確認してみることをお勧めします。 コレクション (C#) | Microsoft Docs コレクションの種類、基本的な使い方など概要的な情報が確認できます。 単純なコレクションを使用する コレクションの種類 System.Collections.Generic のクラス System.Collections.Concurrent のクラス System.Collections のクラス キーと値のペアのコレクションを実装する LINQ を使用してコレクションにアクセスする コレクションを並べ替える カスタム コレクションを定義する 反復子 コレクションとデータ構造 | Microsoft Docs 適切なコレクションを選択するための情報など、.NETで用意されているコレクションに関する様々なトピックが記載されています。 コレクションクラスの選択 一般的に使用されるコレクション型 ジェネリック コレクションを使用する状況 コレクション内での比較と並べ替え Sorted コレクション型 Hashtable コレクション型と Dictionary コレクション型 スレッド セーフなコレクション
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

.NET のコレクションついて再確認する

.NETのコレクションに関するおさらい .NETでは、用途に応じた様々なコレクションクラスが用意されています。 .NETの進化に合わせて、追加されたクラスやインターフェイスもありますが、まとまった知識として追い切れていませんでした。 そこで、.NET5.0(C#9)となった現在(2021年5月)、改めて.NETのコレクションについておさらいしてみたいと思います。 ※今回は、必要な情報にたどり着くためのインデックス的なページとしました。 個々のトピックについては、今後個別に取り上げていきたいと思います。 (次回予定)コレクションの比較(IComparer<T>、IEqualityComparer<T>)について System.Collections から始まる名前空間 ここでは、System.Collectionsで始まる名前空間について、定義されている主要なインターフェイスとクラスについて確認します。 System.Collections 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections?view=net-5.0 リスト、キュー、ビット配列、ハッシュ テーブル、ディクショナリなど、オブジェクトのさまざまなコレクションを定義するインターフェイスとクラスが含まれています。 こちらは、互換性のためだけに残っている遺物です。 可能な限りSystem.Collections.Generic名前空間のコレクションを利用するようにしましょう。 System.Collections.Generic 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.generic?view=net-5.0 ジェネリック コレクションを定義するインターフェイスとクラスが含まれています。このコレクションを使用することにより、ユーザーは、汎用的でない厳密に型指定されたコレクションに比べてタイプ セーフでパフォーマンスが高い、厳密に型指定されたコレクションを作成できるようになります。 ここでは、コレクションを操作するためのインターフェイスと、基本的なコレクションクラス群が定義されています。 要素の比較をサポートするインターフェイス コレクションの並び替えや、要素の同値性を調べる際に利用するインターフェースが定義されています。 インターフェイス 説明 IEqualityComparer<T> オブジェクトの等価比較をサポートするメソッドを定義します。 IComparer<T> 2 つのオブジェクトを比較するために型が実装するメソッドを定義します。 イテレーションを提供するインターフェイス 主にforeach 文をサポートするためのインターフェイス IEnumerable<T> と IEnumerator<T>が定義されています。 また、LINQ to Object の拡張メソッド群は IEnumerable<T> のメソッドとして定義されています。 C#8.0からは、非同期foreachをサポートするためのインターフェイス IAsyncEnumerable<T> と IAsyncEnumerator<T> が追加されています。 非同期ストリームの生成と使用 | Microsoft Docs インターフェイス 説明 IEnumerable<T> 指定した型のコレクションに対する単純な反復処理をサポートする列挙子を公開します。 IEnumerator<T> ジェネリック コレクションに対する単純な反復処理をサポートします。 IAsyncEnumerable<T> 指定した型の値に対して非同期イテレーションを提供する列挙子を公開します。 IAsyncEnumerator<T> ジェネリック コレクションに対する単純な非同期イテレーションをサポートします。 各種コレクションを表現するインターフェイス IList<T>やIDictionary<TKey,TValue>など、コレクションの基本的な操作を行うインターフェイスが定義されています。 また、IReadOnlyCollection<T>などの読み取り専用コレクションを表すインターフェイスも定義されています。 インターフェイス 説明 ICollection<T> ジェネリック コレクションを操作するメソッドを定義します。 IDictionary<TKey,TValue> キーと値のペアのジェネリック コレクションを表します。 IList<T> インデックスによって個別にアクセスできるオブジェクトのコレクションを表します。 ISet<T> セットの抽象化のための基底インターフェイスを提供します。 IReadOnlyCollection<T> 要素の厳密に型指定された読み取り専用のコレクションを表します。 IReadOnlyDictionary<TKey,TValue> キーと値のペアの読み取り専用ジェネリック コレクションを表します。 IReadOnlyList<T> インデックスによってアクセスできる要素の読み取り専用コレクションを表します。 IReadOnlySet<T> セットの読み取り専用の抽象化を提供します。 要素の比較をサポートするクラス 要素の比較をサポートするIComparer<T>、IEqualityComparer<T>を実装する基本クラスが定義されています。 クラス 説明 Comparer<T> IComparer<T> ジェネリック インターフェイスの実装のための基本クラスを提供します。 ReferenceEqualityComparer 2 つのオブジェクト インスタンスを比較するときに、値の等価性 (Equals(Object)) ではなく参照の等価性 (ReferenceEquals(Object, Object)) を使用する IEqualityComparer<T>。 EqualityComparer<T> IEqualityComparer<T> ジェネリック インターフェイスの実装のための基本クラスを提供します。 コレクションクラス 基本的なコレクションのクラスが定義されています。 クラス 説明 Dictionary<TKey,TValue> キーと値のコレクションを表します。 HashSet<T> 値のセットを表します。 LinkedList<T> ダブルリンク リストを表します。 List<T> インデックスを使用してアクセスできる、厳密に型指定されたオブジェクトのリストを表します。 リストの検索、並べ替え、および操作のためのメソッドを提供します。 Queue<T> オブジェクトの先入れ先出しコレクションを表します。 Stack<T> 指定した同じ型のインスタンスの、後入れ先出し (LIFO) の可変サイズのコレクションを表しま SortedDictionary<TKey,TValue> キーに基づいて並べ替えられた、キーと値のペアのコレクションを表します。 SortedList<TKey,TValue> 関連付けられた IComparer<T> 実装に基づいて、キーにより並べ替えられた、キーと値のペアのコレクションを表します。 SortedSet<T> 一定の並べ替え順序で管理されたオブジェクトのコレクションを表します。 System.Collections.ObjectModel 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.objectmodel?view=net-5.0 再利用可能なライブラリのオブジェクト モデル内のコレクションとして使用できるクラスが含まれています。 これらのクラスは、プロパティまたはメソッドがコレクションを返す場合に使用します。 コレクションクラスの基本クラスや、読み取り専用コレクションのクラスが定義されています。 プロパティやメソッドなどでコレクションを外部に公開する際にこれらのクラスを利用します。 クラス クラス 説明 Collection<T> ジェネリック コレクションの基本クラスを提供します。 KeyedCollection<TKey,TItem> キーが値に埋め込まれているコレクションの抽象基本クラスを提供します。 ObservableCollection<T> 項目が追加または削除されたとき、あるいはリスト全体が更新されたときに通知を行う動的なデータ コレクションを表します。 ReadOnlyCollection<T> 読み取り専用のジェネリック コレクションの基本クラスです。 ReadOnlyDictionary<TKey,TValue> キーと値のペアの読み取り専用ジェネリック コレクションを表します。 ReadOnlyObservableCollection<T> 読み取り専用の ObservableCollection<T> を表します。 System.Collections.Concurrent 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.concurrent?view=net-5.0 スレッド セーフなコレクション クラスがいくつか用意されています。複数のスレッドがコレクションに同時にアクセスするときは必ず、これらのコレクション クラスを System.Collections 名前空間および System.Collections.Generic 名前空間の対応する型の代わりに使用する必要があります。 ただし、拡張メソッドや明示的なインターフェイスの実装を介したコレクション オブジェクトの要素へのアクセスは、スレッドセーフであるという保証はなく、呼び出し元による同期が必要になる場合があります。 複数スレッドから同時にアクセス可能なコレクションが定義されています。 Producer-Consumer パターンの実装をサポートするBlockngCollection<T> や、タスク並列処理に用いられるPartitoner<T>などがあります。 .NET での並列プログラミング | Microsoft Docs BlockingCollection クラス | Microsoft Docs クラス クラス 説明 BlockingCollection<T> IProducerConsumerCollection<T> を実装するスレッド セーフなコレクションに、ブロッキングと範囲指定の機能を提供します。 ConcurrentBag<T> オブジェクトの順序付けられていないスレッド セーフなコレクションを表します。 ConcurrentDictionary<TKey,TValue> 同時に複数のスレッドからアクセスできる、スレッド セーフなキーと値のペアのコレクションを表します。 ConcurrentQueue<T> スレッド セーフな先入れ先出し (FIFO) コレクションを表します。 ConcurrentStack<T> スレッド セーフな後入れ先出し (LIFO) コレクションを表します。 OrderablePartitioner<TSource> 並べ替え可能なデータ ソースを複数のパーティションに分割する特定の方法を表します。 Partitioner 配列、リスト、および列挙体に使用できる共通のパーティション方法を提供します。 Partitioner<TSource> データ ソースを複数のパーティションに分割する特定の方法を表します。 インターフェース インターフェイス 説明 IProducerConsumerCollection プロデューサーまたはコンシューマーが使用するためのスレッド セーフなコレクションを操作するメソッドを定義します。 このインスタンスには、プロデューサー/コンシューマー コレクションの統一された表現が用意されています。BlockingCollection のような高度な抽象化では、基になるストレージ機構としてこのコレクションを使用できます。 System.Collections.Immutable 名前空間 Microsoft Docs: https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.immutable?view=net-5.0 変更できないコレクションを定義するインターフェイスとクラスが含まれます。 変更できないコレクションを使用すると、以下のことができます。 ・ コレクションが変更されないことをコンシューマーが確実に保証できるように、コレクションを共有します。 ・ マルチスレッド アプリケーションで暗黙的なスレッド セーフを提供します (コレクションにアクセスするためにロックは不要)。 ・ 関数型プログラミングの方法に従います。 ・ 元のコレクションを維持しながら、列挙中にコレクションを変更します。 インターフェイス インターフェイス 説明 IImmutableDictionary<TKey,TValue> キーと値のペアの変更できないコレクションを表します。 IImmutableList<T> 変更できない要素のリストを表します。 IImmutableQueue<T> オブジェクトの変更できない先入れ先出しコレクションを表します。 IImmutableSet<T> セットの新しいインスタンスを作成することによってのみ変更可能な要素のセットを表します。 IImmutableStack<T> 変更できない後入れ先出し (LIFO) コレクションを表します。 クラス クラス 説明 ImmutableArray 変更できない配列を作成するためのメソッドを提供します。つまり、この配列は、作成後に変更することができません。 ImmutableArray<T>.Builder 余分なメモリを割り当てずに ImmutableArray<T> インスタンスに変換できる書き込み可能な配列アクセサー。 ImmutableDictionary ImmutableDictionary<TKey,TValue> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableDictionary<TKey,TValue>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できないハッシュ マップのインスタンス上で非常に効率よく生成またはビルドできるハッシュ マップを表します。 ImmutableDictionary<TKey,TValue> 変更できない、順序指定されていないキーと値のコレクションを表します。 ImmutableHashSet ImmutableHashSet<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableHashSet<T>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できないハッシュ セットのインスタンス上で非常に効率よく生成またはビルドできるハッシュ セットを表します。 ImmutableHashSet<T> 変更できない、順序が指定されていないハッシュ セットを表します。 ImmutableInterlocked 変更できないコレクションのインタロック交換メカニズムが含まれています。 ImmutableList ImmutableList<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableList<T>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できないリストのインスタンス上で非常に効率よく生成またはビルドできるリストを表します。 ImmutableList<T> 変更できないリスト (インデックスを使用してアクセスできる、厳密に型指定されたオブジェクトのリスト) を表します。 ImmutableQueue ImmutableQueue<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableQueue<T> 変更できないキューを表します。 ImmutableSortedDictionary ImmutableSortedDictionary<TKey,TValue> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableSortedDictionary<TKey,TValue>.Builder メモリ割り当てがほとんどまたはまったくない場合でも変化し、変更できない並べ替えられたディクショナリのインスタンス上で非常に効率よく生成またはビルドできる、並べ替えられたディクショナリを表します。 ImmutableSortedDictionary<TKey,TValue> 変更できない並べ替えられたディクショナリを表します。 ImmutableSortedSet ImmutableSortedSet<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableSortedSet<T>.Builder メモリの割り当てをほとんどまたはまったく伴わずに変更が可能な並べ替えられたセットを表し、変更できない並べ替えられたセットを効率的に操作または構築します。 ImmutableSortedSet<T> 変更できない並べ替えられたセットの実装を表します。 ImmutableStack ImmutableStack<T> クラスのインスタンスの一連の初期化メソッドを提供します。 ImmutableStack<T> 変更できないスタックを表します。 .NET(C#)のコレクションに関連する公式ドキュメント Microsoftの公式ドキュメントには、コレクションに関する様々な情報が記載されています。 特定のトピックについて詳しく踏み込んだ情報なども記載されていますので、一度確認してみることをお勧めします。 コレクション (C#) | Microsoft Docs コレクションの種類、基本的な使い方など概要的な情報が確認できます。 単純なコレクションを使用する コレクションの種類 System.Collections.Generic のクラス System.Collections.Concurrent のクラス System.Collections のクラス キーと値のペアのコレクションを実装する LINQ を使用してコレクションにアクセスする コレクションを並べ替える カスタム コレクションを定義する 反復子 コレクションとデータ構造 | Microsoft Docs 適切なコレクションを選択するための情報など、.NETで用意されているコレクションに関する様々なトピックが記載されています。 コレクションクラスの選択 一般的に使用されるコレクション型 ジェネリック コレクションを使用する状況 コレクション内での比較と並べ替え Sorted コレクション型 Hashtable コレクション型と Dictionary コレクション型 スレッド セーフなコレクション
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Unity】折り畳み機能(アコーディオンメニュー)付きUIの作り方

1 折り畳み機能とは こういうもののこと↓↓ buttonを押すと下に出てきて、もう一回押すと収納される、みたいな。 下に出したとき、これに合わせて、そのさらに下にあった要素も下に下がってくれる、といったもの。 語彙力がなくて申し訳ない…。 2 準備 縦一列に要素を並べるScroll Viewでの使用を想定している。 こういうのができていたら、前提となる状況の理解としては問題ない。 ちゃんとした手順説明が必要な方はこちら。 3 実装方法 UIの配置だが、まずScroll ViewのContentに空オブジェクトを配置する。 その空オブジェクトにImageを二つ、うち一つのImageの子にButtonを一つ配置。 今回は、折り畳み部分に該当するImageのUIの色を、わかりやすく赤色にしてみた。 後は一番上の空オブジェクトに、いくつかコンポーネント追加。 Content Size Fitterをつける意味が気になる方は、先ほど挙げたブログを2ページまでじっくり読んでほしい。 ざっくりいうと、子オブジェクトに合わせて親のアンカーを弄れるようにしないと、折り畳み部分が下のオブジェクトと重なったりしてしまうから。 UIの細かい配置は個々お任せで。 私はButtonを右端に寄せてみた。 4 スクリプト 後はこのスクリプトを空オブジェクトにアタッチすれば完成。 Buttonを180度回転させるプログラムも組んであるが、不要ならば消してほしい。 FoldingSystem.cs using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; public class FoldingSystem : MonoBehaviour { //折り畳み部分を取得 GameObject FoldinfImage; //折り畳み部分を表示するか非表示にするか bool OpenFold = false; //ボタンの画像を回転 RectTransform button; VerticalLayoutGroup contentLayout; void Start() { FoldinfImage = transform.Find("Image2").gameObject; button = transform.Find("Image/Button").GetComponent(); contentLayout = GameObject.Find("Content").GetComponent(); } void Update() { } public void OnClickSetInfo() { if (OpenFold) { button.localRotation = Quaternion.Euler(0, 0, -90); FoldinfImage.SetActive(false); StartCoroutine("LayoutRenewal"); OpenFold = false; } else { button.localRotation = Quaternion.Euler(0, 0, 90); FoldinfImage.SetActive(true); StartCoroutine("LayoutRenewal"); OpenFold = true; } contentLayout.enabled = false; contentLayout.enabled = true; } IEnumerator LayoutRenewal() { //1フレーム停止 yield return null; //再開後の処理 contentLayout.enabled = false; contentLayout.enabled = true; } } 要するに、ContentオブジェクトのVertical Layout Groupをオンオフして、レイアウトを再構築させるような処理。 なぜかコールチンなしで普通に書き連ねても動かない。なんでかなぁ…。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#でレジストリを書き換える

C#でレジストリを書き換える C#で作るアプリケーションの内容によってはレジストリの値を書き換える必要がある場合があります。 私自身C言語で同じようなことをしたことがありましたが、C#では初めてレジストリ書き換えを行ったので、備忘録として残しておきます。 テーマ 今回は、レジストリの値を取得し、「ライトモードが設定されていたらダークモードへ変更する」ようなコードを書いてみます。 注意 本プログラムはレジストリを操作しますが、レジストリはWindowsにとって大変重要なものです。 実際にテストは行っていますが、万が一プログラムが誤っていた場合は実行するとレジストリが破損しWindowsの実行が不可能になってしまう可能性があります。 操作は慎重に行って下さい。また、クリーンインストールしても問題ない予備のPC等で実行することをオススメします。 本コードはWindows10の最新バージョンでのみ実行可能であることを確認しているため、古いWin10やそれ以前の7等では動作確認していません。注意して下さい。 環境 OS:Windows10 Home 64bit 20H2適用済 ビルド19042.964 コンピューターの環境は以下の通りです。 参考 レジストリから値を読み込む - C#プログラミング レジストリの値を設定するには? C#でレジストリを操作する方法をわかりやすく解説! ↓特にこのサイトを一番参考にさせて頂きました。ありがとうございます。 C# Windows10のダークモードいいっすね!アプリケーションのダークモード設定を取得してみましょ!ヽ(^。^)ノ レジストリいじりはMicrosoft.Win32名前空間を使えば可能 ググってみると、どうやらMicrosoft.Win32名前空間のOpenSubkeyメソッドとSetValueメソッドを利用すればレジストリの書き換えが可能らしい。 レジストリの書き換えには管理者権限が必要 レジストリの書き換えには管理者権限が必要であるため、管理者権限でアプリケーションを動作させる方法を記載しておきます。 プロジェクトの名前を右クリック→追加→新しい項目 の順番でクリックします。 「新しい項目の追加 - プロジェクト名」という以下のようなウィンドウが表示されたら、その中から「アプリケーション マニフェスト ファイル(Windows のみ)」という項目をクリックし、追加します。 追加できたら、ソリューションマネージャーの中に「app.manifest」のようなファイルが出ているかと思います。 先程の追加の過程で名前を変更した場合は違う名前になっているとは思いますが、少なくとも拡張子が「.manifest」のファイルが作成できていれば成功です。 続いてこのmanifestファイルを修正していきます。 標準ではこのようなファイルになっています。 この画像の真ん中ちょい上くらいに、「requestExecutionLevel」というのが見えていると思います。 こいつです↓ 現在、このrequestExecutionLevelのlevelが「asInvoker」になっています。 これを以下のように「requireAdministrator」へ変更して下さい。 これをすることで、アプリケーション実行時にお馴染みの「ユーザーアカウント制御」が出現します。 これが出るだけでなんだか「それっぽく」なった気がしますねぇ・・・ 以上でレジストリ書き換えの前準備は完了です。 実際にレジストリの書き換えを実行 実際に書き換えを実行していきます。 まず「Microsoft.Win32名前空間を利用する」旨をコードの先頭に記載します。 using Microsoft.Win32; いよいよ書き換えを行います。 その前に・・・今回書き換えるレジストリを確認 Windows10でダークモードを司るレジストリは2種類あります。 1つめがこれ↓ HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\SystemUsesLightTheme こいつはシステム(Windowsのタスクバーとか)がダークモードの配色を利用するかどうかを決めます。 2つめがこれ↓ HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize\AppsUseLightTheme これはWindows上で動作するアプリケーション(Webブラウザとか)がダークモードの配色を利用するかどうかを決めます。 もともとWindows10の標準は1つめの「SystemUsesLightTheme」が0(つまりダーク)で、「AppsUseLightTheme」が1(つまりライト)です。 ちなみにwindowsにダークモードが追加されたのは2016年のAnniversary Updateからで、それまではダークモードが存在しませんでした。 今回動作させるアプリケーションは、Windows10が最新版にアップデートされている前提で作成します。 つまりこのレジストリが「存在する」前提で作成を進めるので、もし古いバージョンのWindowsも対象にしたい場合は「キーの存在確認」を入れる必要があります。 書き換えコード int getmode = 5; string rKeyName = @"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize"; string rGetValueName = "AppsUseLightTheme"; Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(rKeyName, true); getmode = (int)rKey.GetValue(rGetValueName); if(getmode == 1) { rKey.SetValue("AppsUseLightTheme", 0); rKey.SetValue("SystemUsesLightTheme", 0); rKey.Close(); } string rKeyNameでは、レジストリの場所を指定しています。 レジストリエディターの上部に表示されているようなパスです。 ちなみにここへの指定で「コンピューター」も「HKEY_CURRENT_USER」も不要です。 string rGetValueName = "AppsUseLightTheme"; Microsoft.Win32.RegistryKey rKey = Microsoft.Win32.Registry.CurrentUser.OpenSubKey(rKeyName, true); getmode = (int)rKey.GetValue(rGetValueName); そしてここでキーをint型で取得しています。 rGetValueNameは取得するレジストリの名前です。 今回は「AppsUseLightTheme」を指定しています。 Systemの方は前述の通りWindowsの標準が「システムはダークのアプリがライト」というものなので、システムはもともと「ダーク」になっている可能性が非常に高いために「システム」側のモードのチェックは行っていません。 OpenSubKeyの第2引数「true」は、書き込み可能モードで開くことを指定しています。 getmode変数にはint型で取得されたAppsUseLightThemeの値が記されています。 if(getmode == 1) { rKey.SetValue("AppsUseLightTheme", 0); rKey.SetValue("SystemUsesLightTheme", 0); rKey.Close(); } そしてgetmodeが1(つまり、アプリのモードがライト)だった場合、Software\Microsoft\Windows\CurrentVersion\Themes\PersonalizeのAppsUseLightThemeとSystemUsesLightThemeの値を0にする(ダークにする)という意味です。 rKey.Close();は、レジストリを閉じています。 まとめ C#でレジストリをいじるには「Microsoft.Win32名前空間」が使える レジストリのパスは「HKEY_CURRENT_USER」以前は不要。 レジストリも使い終わったら閉じる 以上です。ありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Unityでボタンやメニューを流れるように表示する

CSS等でよく表現されるメニューやボタンを順番に表示するアニメーションをUnity上で再現する方法を考えてみました。要素を追加すると自動的にアニメーションを開始するCSSのanimationの仕様を見て思いついたものです。 ObjectShifter.csをエディターではなく、Awake時にスクリプトでアタッチします private void Awake() { ParameterButtons = new ObjectShifter[11]; ParameterButtons[0] = btn0.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[1] = btn1.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[2] = btn2.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[3] = btn3.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[4] = btn4.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[5] = btn5.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[6] = btn6.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[7] = btn7.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[8] = btn8.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[9] = btn9.gameObject.AddComponent<ObjectShifter>(); ParameterButtons[10] = btn10.gameObject.AddComponent<ObjectShifter>(); foreach (ObjectShifter Shifts in ParameterButtons) { Shifts.SetHidePosition(Vector3.left * 360); } } SetHidePositionで移動先の位置を設定します 以下のように配列に命令をすると順に表示されます duration オブジェクトが隠れるまたは表示されるまでの時間 delayper 次のオブジェクトが移動を解するまでの遅延時間 public void ShowParameteres(float duration, float delayper) { for (int i = 0; i < ParameterButtons.Length; i++) { ParameterButtons[i].Show(duration, delayper * i); } } public void HideParameters(float duration, float delayper) { for (int i = 0; i < ParameterButtons.Length; i++) { ParameterButtons[i].Hide(duration, delayper * i); } } GameObjectであれば何でもカスケード表示ができます。 ObjectShifter.cs using System.Collections; using System.Collections.Generic; using UnityEngine; public class ObjectShifter : MonoBehaviour { private Vector3 DefaultPosition; private Vector3 HidePosition; private Vector3 PrePosition; private Vector3 ToPosition; private void Awake() { DefaultPosition = HidePosition = PrePosition = ToPosition = transform.localPosition; } private float Delay = 0; private float Duration = 0; private float CurrentTime = 0; public bool toHide = true; public bool isHide { get { return Vector3.Distance(HidePosition, transform.localPosition) <= Vector3.kEpsilon; } } public void SetHidePosition(Vector3 ShiftPosition) { HidePosition = DefaultPosition + ShiftPosition; } public void Show(float duration, float delay = 0) { Delay = delay; Duration = duration; CurrentTime = 0; PrePosition = transform.localPosition; ToPosition = DefaultPosition; } public void Hide(float duration, float delay = 0) { Delay = delay; Duration = duration; CurrentTime = 0; PrePosition = transform.localPosition; ToPosition = HidePosition; } public bool isAnimation { get { return Duration > 0 && Duration > CurrentTime; } } // Start is called before the first frame update void Start() { } // Update is called once per frame void Update() { if (Delay > 0) { Delay -= Time.deltaTime; } else { if (isAnimation) { CurrentTime += Time.deltaTime; float r = Mathf.Clamp01(CurrentTime / Duration); //EaseOut r = -r * (r - 2.0f); transform.localPosition = Vector3.Lerp(PrePosition, ToPosition, r); } else { transform.localPosition = ToPosition; } } } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む