読者です 読者をやめる 読者になる 読者になる

たいちょーの雑記

ぼくが3日に一度くらい雑記をかくところ

たのしい拡張メソッド

肘の痛みが取れない

たぶんしぬ

VSがないといきていけない

VisualStudio2017がリリースされましたね。 www.visualstudio.com
自分はUnityとかC#でなんかするときはエディターにVSCommunityを使ってますので新バージョンのリリースはわくわくもんです。

ぼくはインテリセンスにどっぷり浸かってしまっているので他のではできないですね・・・おそるべし

インストーラーの段階でUnityのツールが同時にインスコできたりするので楽になりましたね。

何よりUIがかっこいいのよね

拡張メソッドたのしい

前回の記事でちょいと書いた拡張メソッドなんですけど、あれからそれにはまってしまいました。
拡張メソッドにハマるってなんだよ って思うと思うんですけど、拡張メソッドばかり書いて肝心の作品ができてないってことです。沼ですね。

最近ではメソッドチェーンとか三項演算子を見ていると

纏めて一つの拡張メソッドにしたい

というわけのわからない衝動がわくようになりました。
例えば

str = str.Length < limit ? str : str.Substring(0,limit);

こういうのがあれば

public static string Truncate(this string s,int boader) {
    if (s.Length < boader) return s;
    return s.Substring(0, boader);
}

こうして

str = str.Truncate(limit);

こうしたくなるんです!可読性もいいし精神的に良いでしょ?変な変数も増えないし?補完も変数名かいて.打てばインテリセンスがしてくれるし

だからなんか作るのが止まらないです。おかげできれいにはなったんじゃないかな・・・・・・
最近は文字列処理系が多くて前回の記事にあったDocking()は派生が結構できちゃってたのしくなっちゃう

public static string RangeDocking<T>(this IEnumerable<T> list, int start, int range, Func<T, string> filter = null) {
    string str = "";
    T[] array = list.ToArray();
    for (int i = start; i < range; i++) {
        str += (filter != null ? filter(array[i]) : array[i] + "");
    }
    return str;
}

コレクションのここからここまで連結したい!なんていうのは日常茶飯事だし、デリゲート渡せばちょいとした加工もしながら連結できるし気に入ってる一つです。
ほかにも個人的に気に入ってるのがこちら

[Conditional("UNITY_EDITOR")]
public static void UnityDebugLog(this object s) {
    UnityEngine.Debug.Log("UnityDebugLog value = " + s);
}

てきとうに値が見たいだけなのにDebug.Log()打つのが面倒だったので拡張しちゃったほしみ
単純だけどすごくべんり・・・とけちゃう

文字列の後ろから何文字か削除とかいうメソッドも(たぶん)ないし、いちいちSubstringするのたるいし

public static string RemoveRangeFromLast(this string s,int range) {
    if (range <= 0) return s;
    return s.Substring(0, s.Length - range);
}

自分しか使わないので需要とかパフォーマンスも気にする必要ないし

/// <summary>
/// T1tT2のIEnumerableからUniRx.Tupleのリストを生成して返す罪深いメソッド
/// </summary>
public static List<Tuple<T1, T2>> MakeTupleList<T1, T2>(this IEnumerable<T1> list, IEnumerable<T2> combination) {
    List<Tuple<T1, T2>> rt = new List<Tuple<T1, T2>>();
    var listRange = list.Count() > combination.Count() ? combination.Count() : list.Count();
    var array_list = list.ToArray();
    var array_combi = combination.ToArray();
    for (int i = 0; i < listRange; i++) {
        rt.Add(new Tuple<T1, T2>(array_list[i], array_combi[i]));
    }
    return rt;
}

インデックスが範囲外になっちゃうの気にするのが楽になるし

/// <summary>
/// 定義域を超えないようにしてくれる心優しいメソッド
/// </summary>
public static int AutoDomain(this int value, int _min, int _max) {
    return value < _min ? _min : value > _max ? _max : value;
}

三項演算子りすぎてわけわからんくなった

さて作業にもどりますかね