2011-10-28 9 views
4

まずは、誤植をお許しください。英語は母国語ではありません。C#4.0のおおよその値を比較していますか?

ここに私の質問です。私は、次のような近似値を表すクラスを作成しています:

public sealed class ApproximateValue 
{ 
    public double MaxValue { get; private set; } 
    public double MinValue { get; private set; } 
    public double Uncertainty { get; private set; } 
    public double Value { get; private set; } 

    public ApproximateValue(double value, double uncertainty) 
    { 
     if (uncertainty < 0) { throw new ArgumentOutOfRangeException("uncertainty", "Value must be postivie or equal to 0."); } 

     this.Value = value; 
     this.Uncertainty = uncertainty; 
     this.MaxValue = this.Value + this.Uncertainty; 
     this.MinValue = this.Value - this.Uncertainty; 
    } 
} 

私は= Xのように、不確実なmeasurmentsのために例えば8.31246 +/- 0.0045を、このクラスを使用すると、これらの値に対して計算を実行します。

このクラスの演算子をオーバーロードします。最後のケースでは、私は、しかし

public static bool? operator >(ApproximateValue a, ApproximateValue b) 
    { 
     if (a == null || b == null) { return null; } 

     if (a.MinValue > b.MaxValue) { return true; } 
     else if (a.MaxValue < b.MinValue) { return false; } 
     else { return null; } 
    } 

:私は考え最初のものは、このようなものである...、>、> =を実装する方法を知っている< =と<演算子はありません正確な結果が「null」ではないため、この「null」には満足しません。それは '真実'かもしれないし、「偽」かもしれない。

.Net 4には、私が気付いていないこの機能の実装に役立つオブジェクトがありますか、それとも正しい方法ですか?私はまた、比較演算子を実装するのではなく、どのような状況で値が優れているかどうかを定義するブール値の代わりにオブジェクトを使用することを考えていましたが、達成しようとしているものに対しては少し複雑です。 。

+3

比較の仕組みを指定していないため、比較を実装することはできません。そのような比較を支配するルールを書き留めます。このようなルールを思いつくのが難しい場合は、それ以上の文脈がなくても比較が意味をなさないというヒントです。 – Jon

+3

@Guillaume:FYIと同様に、.NETでnull>がfalse、null がヌルを意味するものを再定義するべきではありません。 –

+0

なぜブール演算でnullを返そうとしていますか?あなたがApproximateValueをヌル可能な型にすることさえ許される理由は、私にはありません。 –

答えて

1

これは、値の型(struct)を定義することがより賢明になるケースの1つで、nullのケースの懸念を排除します。また、MinValueとMaxValueを計算時のプロパティとして保存するのではなく、結果を計算するgetメソッドを実装するだけで、計算プロパティに変更することもできます。

近似値の比較自体は近似値なので、データ型のユースケースを考慮する必要があります。範囲が重複しないときを比較するためにのみ比較を使用するつもりですか?それは本当にあなたのタイプの意味にかかっています。これは、正規分布したデータセットからのデータポイントを表すことを目的としていますか?不確かさはサンプリングの標準偏差のいくつかですか?そうだとすれば、それは比較演算が数値確率返すようにするために多くの意味になるかもしれない(もちろんの比較演算子を介して呼び出すことができませんでした。)

+0

丁寧に答えてください。これは、問題の最大の範囲と考慮すべき最大の範囲を持つものだと思います。ありがとう! – Guillaume

1

あなたはa.MaxValue == b.MinValueも、間違ったようだnullを返しますあなたの現在の実装で、それはあなたが、仕様が実際に仕事をしたいかに基づいてtrueまたはfalseを返す必要がありますいずれかのかどうかを確認する必要があるように私には見えます。私はこのためのネットの機能に組み込まれているかどうかはわからないので、あなたはそれを正しい方法で行っていると信じています。

1
return a.Value - a.Uncertainty > b.Value + b.Uncertainty 

私はセマンティクスを持つ本当に混乱はないだろう>bool?はここでは危険な返品タイプです。つまり、不確実性を考えれば、trueを返すことができます。aの場合、> bとなる可能性があります。

3

私はおそらくこのようなことをします。

public int CompareTo(ApproximateValue other) 
{ 
    // if other is null, we are greater by default in .NET, so return 1. 
    if (other == null) 
    { 
     return 1; 
    } 

    // this is > other 
    if (MinValue > other.MaxValue) 
    { 
     return 1; 
    } 

    // this is < other 
    if (MaxValue < other.MinValue) 
    { 
     return -1; 
    } 

    // "same"-ish 
    return 0; 
} 

public static bool operator <(ApproximateValue left, ApproximateValue right) 
{ 
    return (left == null) ? (right != null) : left.CompareTo(right) < 0; 
} 

public static bool operator >(ApproximateValue left, ApproximateValue right) 
{ 
    return (right == null) ? (left != null) : right.CompareTo(left) < 0; 
} 

public static bool operator <=(ApproximateValue left, ApproximateValue right) 
{ 
    return (left == null) || left.CompareTo(right) <= 0; 
} 

public static bool operator >=(ApproximateValue left, ApproximateValue right) 
{ 
    return (right == null) || right.CompareTo(left) <= 0; 
} 

public static bool operator ==(ApproximateValue left, ApproximateValue right) 
{ 
    return (left == null) ? (right == null) : left.CompareTo(right) == 0; 
} 

public static bool operator !=(ApproximateValue left, ApproximateValue right) 
{ 
    return (left == null) ? (right != null) : left.CompareTo(left) != 0; 
} 
+0

これは良い答えですが、一般的なケースでは2つの値が同じであると考えると、どちらも正確ではない可能性があります。 – Guillaume

1

それはあなたが欲しいのでTernary Logicのいくつかのフォームを実装しようとしているように私には思える:私はCompareTo()の結果に応じ=>IComparable<ApproximateValue>を実装し、その後<を定義し、>、< =を、と思います演算子をTrue、FalseまたはIndeterminateのいずれかに適用した結果。これを行う際の問題は、組み込みのブール値とあなたの不定値を実際に組み合わせることができないことです。だからあなたは2つの比較のいくつかの限られた形式を行うことができましたApproximateValues私は、これらの比較の結果としてboolを使用することは不適切だと考えています。これは、比較の結果がbool値をもたらす他の式不確実な価値の可能性がそれを損なう。たとえば、ORの左側の演算結果が不定の場合は、次のようにするのは意味がありません。

ApproximateValue approx1 = ...; 
ApproximateValue approx2 = ...; 
bool result = ...; 

bool result = approx1 > approx2 || someBool; 

だから、私の意見では、私はそれはあなたが不確定を保持したい場合はすべてでの演算子としての比較を実装するために良いアイデアだとは思いません。ここで提供されている解決策は、不確定性を排除しますが、それはもともと指定されたものではありません。

+0

他のブール値と比較すると良い点が挙げられます... – Guillaume

関連する問題