Comparison.CompareType
enum
名前空間:SilCilSystem.Math
Assembly:SilCilSystem.Packages
値を比較するための列挙型です。 インスペクタ上から指定できるようにするために作成しました。
メンバ一覧
比較方法
value | description |
---|---|
EqualTo | 一致している場合true |
NotEqualTo | 一致していない場合true |
LessThan | 値が小さい場合true |
LessThanOrEqualTo | 値が小さいか一致している場合true |
GreaterThan | 値が大きい場合true |
GreaterThanOrEqualTo | 値が大きいか一致している場合true |
拡張メソッド
return | signature | description | note |
---|---|---|---|
bool | Compare<T>(this CompareType compareType, T value1, T value2) | value1とvalue2を比較 | TはIComparable<T> |
bool | Compare<T>(this CompareType compareType, T value1, T value2, IComparer<T> comparer) | value1とvalue2を比較 | |
bool | CompareTo<T>(this T value1, T value2, CompareType compareType) | value1とvalue2を比較 | TはIComparable<T> |
bool | Compare<T>(this T value1, T value2, CompareType compareType, IComparer<T> comparer) | value1とvalue2を比較 |
使用例
Compare
メソッド、もしくはCompareTo
メソッドを利用します。
float
やint
, string
などはIComparable<T>
を継承しているので、そのまま使えます。
継承されていないものに関してはIComparer<T>
を継承したものを指定しましょう。
using UnityEngine;
using SilCilSystem.Math;
public class TestComparison : MonoBehaviour
{
[SerializeField] private Comparison.CompareType m_compareType = default;
[SerializeField] private float m_value1 = 0f;
[SerializeField] private float m_value2 = 1f;
private void Update()
{
bool result = m_compareType.Compare(m_value1, m_value2);
// こっちでもOK.
// bool result = m_value1.CompareTo(m_value2, m_compareType);
Debug.Log(result);
}
}
実装
switch
構文でそれぞれ処理しています。
public static bool Compare<T>(this CompareType compareType, T value1, T value2) where T : IComparable<T>
{
switch (compareType)
{
case CompareType.EqualTo: return value1.CompareTo(value2) == 0;
case CompareType.NotEqualTo: return value1.CompareTo(value2) != 0;
case CompareType.LessThan: return value1.CompareTo(value2) < 0;
case CompareType.LessThanOrEqualTo: return value1.CompareTo(value2) <= 0;
case CompareType.GreaterThan: return value1.CompareTo(value2) > 0;
case CompareType.GreaterThanOrEqualTo: return value1.CompareTo(value2) >= 0;
default: return false;
}
}
エディタ上ではEnumLabel属性を使用して、記号で表示されるようにしています。