2012-01-11 5 views
1

私はC#にはかなり新しく、クラスやデータ構造、または処理する方法があるのか​​不思議でした次の要件... データの範囲(例えば1〜10または5〜245)を表すintのCOUPLEを処理する必要があり、Int値が範囲に含まれているかどうかを検証するメソッドが必要です。 。 私は、C#の中で、私の必要条件を処理するためのフレームワークにクラスが構築されていると信じています... INT(例えば5)が値の範囲に含まれているかどうかを確認する必要があります。 10)...C#に2つのINT(2 INT -1-10の範囲)を扱うクラスがありますか?

これを処理するクラスがないことがわかった場合は、2つの数値を含むStruct 5が1-10の範囲に含まれているかどうかをテストする独自のContainメソッドを作成する

+3

何:

public static class Extensions { public static bool IsInRange(this int value, int min, int max) { return value >= min && value <= max; } } 

を次に、あなたのような何かを行うことができますあなたのユースケースですか?番号が範囲内にあることをどのように確認したいですか?そうでない場合はどうしますか? – Gabe

答えて

2

要件を厳密に満たすものはありません。

私はあなたを正しく理解していると仮定すると、クラスはとても簡単に書くことができます。

class Range 
{ 
    public int Low {get; set;} 
    public int High {get; set;} 

    public bool InRange(int val) { return val >= Low && val <= High; } 
} 

Tuple<int,int>はあなたの道の一部になるだろうが、あなたは余分な動作を取得するための拡張メソッドを追加する必要があると思います。欠点は暗黙的に下限と上限がItem1Item2であることです。が混乱する可能性があります。私は にそれを処理するためのクラスが存在しないことを発見しなければならない場合は

// written off-the-cuff, may not compile 
public static class TupleExtension 
{ 
    public static bool InRange(Tuple<int, int> this, int queryFor) 
    { 
     return this.Item1 >= queryFor && this.Item2 <= queryFor; 
    } 
} 
4

、私は2つの数値が含まれている構造体で行くと かどうかをテストするために私自身含まれ方法を作ることを考えていました5は何がビルトインクラスBCLであなたのシナリオでありませんよう、実際に素晴らしいアイデアだ範囲 1-10)

に含まれています。

+0

実際に私はちょうどEnumerable.Range(1,100).Contains(x)を見つけましたが、パフォーマンスについてはわかりません...数百万のEnumerable.Range(1,100)またはリスト数百万の構造体とより単純なチェックメソッドを持つ/ハッシュテーブル??? http://stackoverflow.com/questions/3188672/how-to-elegantly-check-if-a-number-is-within-a-range – yamini

+1

@yamini、yeah、great、しかしこれはメソッドでありデータではありませんあなたが求めていたような構造です。 –

2

範囲タイプをお探しの場合は、 .Netフレームワークにはこれが含まれていません。

提案するとおり、不変の(!)Int32Range構造体を作成する必要があります。
IEnumerable<int>を実装して、ユーザーが範囲内の数字を簡単にループできるようにすることができます。

各バインドを含むかどうかを判断する必要があります。
[Start, End)がおそらく最も明白な選択です。
選択した内容は、XMLコメントで明確に文書化する必要があります。

+0

興味のないところでは、なぜ不変が望ましいのでしょうか? –

+0

http://stackoverflow.com/questions/441309/why-are-mutable-structs-evil – SLaks

+0

ああ、私はなぜ、構造体(なぜ構造体は不変でなければならないのか?再度好奇心の外に。 –

0

私はあなたが配列でそれを行うことができると思います。 いくつかの素晴らしい例や説明はここで見つけることができます:あなたは本当にしているとして(範囲の大きさに応じて)私の知る限りで構築 http://www.dotnetperls.com/int-array

+0

詳しいことはできますか?配列を使用した非常に明白な解決法はありません –

0

何も、しかしEnumerable.Rangeは、仕事(しかし最適ではないだろうエンドポイントだけでなく、範囲内のすべての値を格納します)。 LINQメソッド(Enumerable.Containsを含む)を使用することができますが、これは便利な機能です。

const int START = 5; 
const int END = 245; 

var r = Enumerable.Range(START, (END - START)); // 2nd param is # of integers 
return r.Contains(100); 

個人的に、私はおそらく先に行くだろうと、それはかなり単純なので、クラスを作成(そして、あなたは常に可算経由IEnumerable<int>イテレータを公開することができます。レンジあなたはそれの上にLINQをしたい場合)

1

新しいタイプのを避けるためにしたい場合は、拡張機能を作成することができます。

if(!value.IsInRange(5, 545)) 
    throw new Exception("Value is out of range."); 
関連する問題