2009-05-21 6 views
0

テーブルが配列や実際に何かになることができる「テーブル」の値を調べる必要があります。
紙には、この(減少および一般)のようになります。「テーブル」で値を見つける効率的な方法C#

Size  500  750 1000 1250 1500 (speed) 
-------------------------------------------- 
6x5  0.1  0.5  0.55 0.58 0.8 
6x4  0.01 0.1  0.4 0.5 0.9 
8x5  0.5  0.9  1.1 1.5 2.0 
10x5  1.2  1.5  2.0 2.7 3.0 
12x6  2.6  3.0  4.4 5.1 7.0 (pressure) 

私は可変サイズとスピードを持っていたときに何とか圧力を抽出する必要があります。
私は今、別々の配列に各行を入れましたが、if elseの束を避けたいのですが、実際にはもっと良い方法はわかりません。助けてくれてありがとう。

答えて

4

は、常に特定の値であり、 (例えばので、何のサイズ780または598)あなたの例で指定されていない値の間に該当しない、スピードとサイズに基づいて検索を実行するための最速の方法は、SizeAndSpeedは、このようなクラスであるDictionary<SizeAndSpeed, double>を持つことである。

public class SizeAndSpeed : IEquatable<SizeAndSpeed> 
{ 
    public string Size { get; set; } 
    public int Speed { get; set; } 
    public bool Equals(SizeAndSpeed other) 
    { 
     return Size == other.Size && Speed == other.Speed; 
    } 
} 

私はSizestringであると仮定していますが、もちろんより複雑なオブジェクトも使用できます。

0

私の頭の上には、DataTableを使用することができます。

Size  Speed  Pressure 
-------------------------------------------- 
6x5  500  0.1 
6x5  750  0.5 
6x5  1000  0.55 
6x5  1250  0.58 
6x5  1500  0.8 
6x4  500  0.01 
1

サイズが一意である場合、その辞書の鍵行い、その後、あなたが他の要素を得るためにそれを使用することができます...

0

サイズと速度のペアを維持するための構造体を作成します。

public struct SizeSpeedKey 
{ 
public string Size; 
public int Speed; 

public SizeSpeedKey(string size, int speed) 
{ 
    Size = size; 
    Speed = speed; 
} 
} 

そして、これは、ルックアップコードのようになります。あなたのサイズと速度を仮定し

using System; 
using System.Collections.Generic; 

namespace LookupTable 
{ 
    internal class Program 
    { 
    private static readonly Dictionary<SizeSpeedKey, double> lookupTable = 
     new Dictionary<SizeSpeedKey, double> 
     { 
     {new SizeSpeedKey("6x5", 500), 0.1}, 
     {new SizeSpeedKey("6x5", 750), 0.5}, 
     {new SizeSpeedKey("6x4", 500), 0.01}, 
     {new SizeSpeedKey("6x4", 750), 0.1}, 
     {new SizeSpeedKey("8x5", 500), 0.5}, 
     {new SizeSpeedKey("8x5", 750), 0.9}, 
     }; 

    private static void Main(string[] args) 
    { 
     // these will of course need to be read from the user 
     var size = "6x4"; 
     var speed = 500; 

     Console.WriteLine("For size = {0} and speed = {1}, the pressure will be {2}", size, speed, lookupTable[new SizeSpeedKey(size, speed)]); 
     Console.ReadLine(); 
    } 
    } 
} 
+0

これは機能しません。 SizeSpeedKeyはIEquatable を実装していないので、辞書はどのようにキー値を比較できますか? –

+0

はい、いいえ。辞書は任意のオブジェクトをキーとして使用できます(すべてが.Equalsと.GetHashCodeを提供します)。これらのメソッドをオーバーライドすることなく、同一性を評価するためにアイデンティティが使用されます。今では構造体が常にコピーされているので、 "等しい"値を見つけることは実際には難しいかもしれません^^ 少なくとも、@ rwwildenの例のように.Equalsをオーバーライドする必要があります。 –

+0

うーん...本当、それ。 +1のrwwilden :) –

関連する問題