3

これはルックアップ クラスです。

public class DistanceAngle
{
    public int distance;
    public int distanceAngle;
    public int valueOfBoth;

    public static void getDisatnceAngleLookup()
    {
        List<DistanceAngle> distanceAngles = new List<DistanceAngle>
                {
                   new DistanceAngle{distance = -5400, distanceAngle = -220, valueOfSideAngle = 320},
                   new DistanceAngle{distance = -5200, distanceAngle = -210, valueOfSideAngle =  290},
                   new DistanceAngle{distance = -5000, distanceAngle = -200, valueOfSideAngle = 200},                                      
                };

        //Distance as Key Value and look for distanceAngle
        Lookup<int, int> lookup = (Lookup<int, int>)distanceAngles.ToLookup((p => p.distance),
                                                                    p => p.distanceAngle);

        int count = lookup.Count;

        // Select a collection of distanceAngles by indexing directly into the Lookup.
        IEnumerable<int> cgroup = lookup[-5400];

        // Output the results.
        Console.WriteLine("\nPackages that have a key of 'C':");
        foreach (int str in cgroup)
            Console.WriteLine(str);
    }
}

インターフェイスから、ユーザーA = 6000 B = 400 C = -5400B-A. distance = -5400C 値がLookUp 呼び出しからの値と等しい場合、値を取得distanceAngle = -220 し、データグリッド固有の列に 1 ~ 5 セルを入力します。

C 値が と等しい場合distance = -5400、値を取得valueOfSideAngle = 320 し、データグリッド固有の列に 6 ~ 10 セルを入力します。

このようにして、列のインデックスを取得できます。datagridview1.Columns["columnName"].Index;

これは、計算を実行している関数です。

private void b_calculate_Click(object sender, EventArgs e)
    {

        int value1;
        int.TryParse(t_LongitudeRadTextBox.Text, NumberStyles.Any,
                         CultureInfo.InvariantCulture.NumberFormat, out value1);

        int value2;
        int.TryParse(t_LongSecondaryRadTextBox.Text, NumberStyles.Any,
                         CultureInfo.InvariantCulture.NumberFormat, out value2);

        var value3 = value2 - value1;


    }

ルックアップ テーブルから値を取得value3 し、datagridview に入力するにはどうすればよいですか。助けて…!

4

1 に答える 1

2

まず、多次元コレクションを必要とする単一のキーから2 つの値 (side angleと) が必要です。キーの値が複数あると複雑になるため、必要な場合にのみ複雑なデータ構造を使用する必要があります。オプションを見てみましょう:distance angledistance

1) あなたの方法:Lookup<int, int>

この方法でのルックアップは、キーが同じで値が異なるエントリがさらにある場合にのみ適用されます。つまり、次の場合:

List<DistanceAngle> distanceAngles = new List<DistanceAngle>
{
   new DistanceAngle{distance = -5400, distanceAngle = -220},
   new DistanceAngle{distance = -5400, distanceAngle = -210},
   new DistanceAngle{distance = -5000, distanceAngle = -200}
};

もしそうなら:

var lookup = (Lookup<int, int>)distanceAngles.ToLookup(p => p.distance, 
                                                       p => p.distanceAngle);

Count 2 のルックアップを取得します。これは、キーが 5400 と 5000 であることを意味しますが、キー 5400 には 2 つの値があります。値はIEnumberable<int>. したがって、キー 5400 の値コレクションには 2 つの値がありますが、IEnumerable<int>キー 5000 の値コレクションには 1 つの値があります。これは本質的に探しているものではありません。

必要なのは のようなものですCollection<TKey, TValue1, TValue2>

2) List<DistanceAngle>:

最良の選択肢は、あなたが持っているリストを先に進めて、遠くからdistance angleandを取得する関数を作成することだと思いますside angle. コメントでリストが大きくなりすぎないと言ったので、次のような拡張メソッドなどを作成できます。

public static int GetDistanceAngle(this List<DistanceAngle> distanceAngles, 
                                   int distance)
{
    var d = distanceAngles.FirstOrDefault(d => d.distance == distance);
    if (d == null)
        return 0; //your value
    return d.distanceAngle;
}

public static int GetSideAngle(this List<DistanceAngle> distanceAngles, 
                               int distance)
{
    var d = distanceAngles.FirstOrDefault(d => d.distance == distance);
    if (d == null)
        return 0; //your preferred value
    return d.sideAngle;
}

これで、次のように呼び出すことができます。

private void b_calculate_Click(object sender, EventArgs e)
{
    int value1;
    int.TryParse(t_LongitudeRadTextBox.Text, NumberStyles.Any,
                     CultureInfo.InvariantCulture.NumberFormat, out value1);

    int value2;
    int.TryParse(t_LongSecondaryRadTextBox.Text, NumberStyles.Any,
                     CultureInfo.InvariantCulture.NumberFormat, out value2);

    var value3 = value2 - value1;

    var sideAngle = distanceAngles.GetSideAngle(value3);
    var distanceAngle = distanceAngles.GetDistanceAngle(value3);
    //etc
}

3) 高速なルックアップが必要な場合は、ディクショナリ (重複がない場合) またはルックアップ (重複がある場合) に頼ることができますが、Dictionary<int, Tuple<int, int>>またはのようなものを使用するのLookup<int, Tuple<int, int>>は面倒です。

4) あなたができること:Dictionary<int, DistanceAngle>またはLookup<int, DistanceAngle>

(どちらも同じ辞書の 1 つを示します)。

public static Dictionary<int, DistanceAngle> getDisatnceAngleLookup()
{
    List<DistanceAngle> distanceAngles = new List<DistanceAngle>
    {
       new DistanceAngle{distance = -5400, distanceAngle = -220, valueOfSideAngle = 320},
       new DistanceAngle{distance = -5200, distanceAngle = -210, valueOfSideAngle =  290},
       new DistanceAngle{distance = -5000, distanceAngle = -200, valueOfSideAngle = 200},                                      
    };

    //Distance as Key Value and look for distanceAngle
    return distanceAngles.ToDictionary(p => p.distance, p => p);
}

}

キーによるアクセスは簡単になりました。

private void b_calculate_Click(object sender, EventArgs e)
{
    int value1;
    int.TryParse(t_LongitudeRadTextBox.Text, NumberStyles.Any,
                     CultureInfo.InvariantCulture.NumberFormat, out value1);

    int value2;
    int.TryParse(t_LongSecondaryRadTextBox.Text, NumberStyles.Any,
                     CultureInfo.InvariantCulture.NumberFormat, out value2);

    var value3 = value2 - value1;

    var sideAngle = distanceAngles[value3].sideAngle;
    var distanceAngle = distanceAngles[value3].distanceAngle;
    //etc
}
于 2012-11-04T15:36:59.583 に答える