最初の発想は・・・
- この値はこの別の値と組になっているのが正しいことが証明されている配列がほしい。(例えば、UnityでGameObject(A)とGameObject(B)が空のGameObject(C)の子に設定されているオブジェクトが複数個あるときにどのオブジェクトがどのオブジェクトと組になっているのかが知りたい)
- Dictionaryよりも柔軟性がある物が欲しい。
- Listとタプルで作ろう。
そんな考えでできたのが以下の拡張メソッド。
ListExtentions.cs
public enum LRSwitch{
LEFT,
RIGHT
};
public static bool TupleContains<TObject, TComponent, TValue>(this IList<(TObject, TComponent)> extList, TValue value, LRSwitch lr)
{
if(lr == LRSwitch.LEFT)
{
return extList.Select(obj => obj.Item1).Any(item => item.Equals(value));
}
else if(lr == LRSwitch.RIGHT)
{
return extList.Select(obj => obj.Item2).Any(item => item.Equals(value));
}
else
{
return default;
}
}
public static TComponent TupleContainsGetComponent<TObject, TComponent, TValue>(this IList<(TObject, TComponent)> extList, TValue value)
{
return extList.First(obj => obj.Item1.Equals(value)).Item2;
}
- 1つ目の拡張メソッドはListの中にあるタプルの組1か組2の値を第3引数と比較して格納されていたら真偽値を返すだけの拡張メソッド。
普通にListにContainsメソッドにがあるけど、そのためにちょっと毎回この手のロジックを書くのがめんどくさかったのが伺える。 - 2つ目はタプルの組1の値と第3引数と比較して、その値が存在していたら組2の値を返す拡張メソッド。なんか複雑なことをしてそうでしてない感じ。・・・なんで作ったんだろう?多分存在するかどうかを確認しつつ値を返してほしかったんだろうね・・・
総評(自分でだけど)
見れば見るほど「Dictionaryでよくね?」という気持ちが溢れ出ています。
多分あとからどちらの数値にも値を代入するつもりがあったんだろうね・・・
でも、これで少しでもC#の拡張メソッドについて学べたのは良かったと思います。