赤宿 = Red Inn

素人の試行錯誤と2Dローグライク・ゲーム制作

My C# Extentions / Utils

 桟橋がC#で使っている、汎用的なUtil一覧。随時更新

 シグネチャはRust風の擬似コードで。参考はStack Overflow。

拡張メソッド

IEnumerable<T> 拡張
// foreach( .. ) { .. } が一行で書ける
fn forEach<T>( self: Iter<T>, action )

// 副作用のための flatMap or SelectMany (LINQ)
fn flatForEach<T>( self: Iter<Iter<T>>, action: Fn(T) -> None) )

// flat系。flatten().Any( .. ) という形の方が良いかも?
fn flatAny<T>( self: Iter<Iter<T>>, conditioner: Fn(T) -> bool ) -> bool

// mapした値が最小となるitemを返す
fn minBy<T,U>( self: Iter<T>, mapper: Fn(T) -> U ) -> T? where T: Ord

 FirstOrDefaultの亜種として、firstOrValue( self: Iter<T>, logic, value ) みたいなものも用意するかも。SingleSafelyも欲しい。

その他拡張
// 値を[min, max]に収めて(丸めて?)返す
fn clamp<T>( value, min, max ) -> T where T: Ord

// string.Format() のラッパ
fn format( self: string )

小ネタ

辞書の分解を楽に (foreach時)

 foreach( var( key, value) in dict ) { .. } が書けるようになる。

public static void Deconstruct<T1, T2>( this KeyValuePair<T1, T2> tuple, out T1 key, out T2 value ) {
    key = tuple.Key;
    value = tuple.Value;
}
Enum要素の列挙

 擬似コードで。

// where T: System.Enum (C#7.3~) という型制約もアリ
fn enumeralate<T>() -> Iter<T> {
     System.Enum.GetValues( typeof( T ) ).Cast<T>()
}

Util系クラス

  • ListQueue<T> : IEnumerable<T>
    • enqueue(), dequeue(), peek(), remove( index ), indexer[]
    • storege: List<T> で実装
  • ObservableList<T> : IList<T>
    • 変更時にイベントを発行。ドキュメントを読みたくなくて自作

以上

 あまり無かった。clampのように、名前を知らないけれど絶妙に役立つ拡張メソッドは嬉しい。(それ以上に、C#8のswitch式が嬉しい。実装待ち!)。

 拡張メソッドを集めたサイト、Extension Method: Home of 805 extension methods for C#, VB, F#, Swift, Kotlin and Javascript というのもあるらしい。