【C#】学習備忘録 2020年6月編

HashSet / SortedSet

HashSet

要素に重複のないリストが作れる。
HashSet に要素をAddする際に重複チェックが不要。
Addして重複している場合は false が返ってくる。

class Program
{
	static void Main( string[] args )
    {
		var set1 = new HashSet<string>();
		set1.Add( "b" );
		set1.Add( "a" );
		set1.Add( "c" );
		set1.Add( "a" );
		set1.Add( "x" );

		var list = set1.ToList();
		foreach( var s in list )
        {
			Console.WriteLine( "{0}", s );
		}
	}
}
// 出力

b
a
c
x

SortedSet

上記の HashSet をソートして管理したい場合は SortedSet が使える 。

// 出力

a
b
c
x

要素をソートする必要性がない場合は HashSet を利用。
ソートしていたほうが都合が良い場合は SortedSet を利用。

IEnumerable<T>

指定した型のコレクションに対する単純な反復処理をサポートする列挙子を公開します。

Microsoft Docs:  IEnumerable<T> インターフェイス

上だとちょっとよく分からない。もうちょっと詳しく調べてみよう。

要は「繰り返して連続して値を読み込むことができる機能を提供する」インターフェースのことです。

C#でIEnumerableインターフェースを実装してみる

ほう、でもこれって配列や List とは何が違うのだろうか?
もうちょっと詳しく調べてみました。

スクリーンショット 2020-06-06 21.16.43

スクリーンショット 2020-06-06 21.16.52

引用:++C++; // 未確認飛行 C「 IEnumerable インターフェース

Yahoo!知恵袋にあった以下のベストアンサーで少し理解が進みました。

<List型や配列の場合>
List型や配列は、C# の開発環境のほうで、既に用意している反復子です。

<IEnumerable の場合>
IEnumerable を使って作るクラスは、自分で作る反復子です。

C#のList型とIEnumerable型の違い

変数につく @if や @object などの 接頭辞`@`の意味

変数に if や int など 予約語そのものを使うことはできません。
ただ、予約語の前に @ を付けると変数とみなされます。
推奨はされていないとのこと。

   var @if = 0;
   var @else = 1;
   var @switch = 2;

参考:C#でキーワード(予約語)を変数名として使うには

WeakReference (弱参照)

「オブジェクトを使いたいんだけども、GC 的には参照していることにしないでほしい」、 「自分以外が全員参照を手放したらその時点で削除対象にしてほしい」というような要件がまれにあります。 こういう、GC の参照探索上は除外してほしい参照を、弱参照(weak reference)といいます。

参考:【雑記】弱参照

implicit / explicit

implicit

implicit 変換演算子は、実装しているクラスを「別の型(クラス)」に変換するための実装を行います。

    public static implicit operator MilliMeter(Meter d)
   {
       // MilliMeterクラスへの変換(メートルからミリメートルへの変換)
       return new MilliMeter((long)(d.X * 1000.0), (long)(d.Y * 1000.0));
   }

explicit

explicit 変換演算子は、「別の型(クラス)」を実装しているクラスの型に変換するための実装を行います。

C# 変換演算子(implicitとexplicit)

BindingFlags

バインドおよびリフレクションによるメンバーと型の検索方法を制御するフラグを指定します
引用:BindingFlags Enum (System.Reflection) | Microsoft Docs

GetMethodとかでクラスの中身をリフレクションで探すときにどういう探し方をするか定義できるもの。

■ 自分用まとめ
あるクラスの public や private なメンバ情報(プロパティやメソッド、フィールド、イベントなど)を取得したいときに、BindingFlags の enum を定義して取得する。

// メソッドの一覧を取得する
MethodInfo[] methods = t.GetMethods(
   BindingFlags.Public | BindingFlags.NonPublic |
   BindingFlags.Instance | BindingFlags.Static);

こんなことも出来る↓("To"ではじまるメソッドを検索する)

// using System.Reflection;を使用する

//StringクラスのTypeオブジェクトを取得
Type t = typeof(System.String);

// "To"ではじまるメソッドを検索する
// IgnoreCaseで大文字小文字を区別せずに検索
MemberInfo[] members = t.GetMember("To*",
   MemberTypes.Method,
   BindingFlags.Public | BindingFlags.Instance |
   BindingFlags.DeclaredOnly | BindingFlags.IgnoreCase);

foreach (MemberInfo m in members)
{
   // メンバの名前を表示
   Console.WriteLine(m.Name);
}

実行結果

ToString
ToString
ToCharArray
ToCharArray
ToLower
ToLower
ToUpper
ToUpper

閲覧ありがとうございます。 コンテンツをいいねと思ってくださった方にサポートいただけると大変嬉しいです!