Получить конкретное значение из справочной таблицы?

Это класс поиска:

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 = -5400 на B-A. Если значение C равно distance = -5400 из таблицы 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. Любая помощь...!


person linguini    schedule 04.11.2012    source источник
comment
покажите нам код, где вы заполняете dgv и напишите о том, что не работает. Почему мы должны видеть поиск, когда на самом деле вопрос касается заполнения dgv?   -  person nawfal    schedule 04.11.2012
comment
@ nawfal: обновил вопрос. Спасибо за вашу помощь.   -  person linguini    schedule 04.11.2012
comment
Я прошу показать область кода, где вы заполняете элемент управления dgv. Это так же просто, как dgv[строка, столбец].Value = 'abc'. Сообщите нам, какая часть у вас возникли проблемы. Теперь вы более или менее просите сообщество SO написать весь код для вас с нуля. Это не политика SO   -  person nawfal    schedule 04.11.2012
comment
На самом деле, я хочу знать, как я могу найти Value3, который равен значению в таблице поиска ??   -  person linguini    schedule 04.11.2012
comment
О, хорошо, я понял. Тогда ваше название вопроса вводит в заблуждение.   -  person nawfal    schedule 04.11.2012
comment
Я изменил название вопроса.   -  person linguini    schedule 04.11.2012
comment
давайте продолжим это обсуждение в чате   -  person nawfal    schedule 04.11.2012


Ответы (1)


Во-первых, вам нужны два значения (side angle и distance angle) из одного ключа, то есть distance, для которого требуется некоторая многомерная коллекция. Все, что имеет более одного значения для ключа, становится сложным, и вам следует использовать сложную структуру данных только если это оправдано. Давайте посмотрим на варианты:

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. И значения будут в IEnumberable<int>. Следовательно, у вас есть два значения в наборе значений для ключа 5400 и одно значение в наборе значений IEnumerable<int> для ключа 5000. Это не то, что вы, по сути, ищете.

Вам нужно что-то вроде Collection<TKey, TValue1, TValue2>.

2) List<DistanceAngle>:

Я бы сказал, что лучший вариант — продолжить список, который у вас есть, и создать функцию для получения distance angle и 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>

(Я покажу словарь один, оба одинаковы).

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
}
person nawfal    schedule 04.11.2012
comment
@Neolisk У меня был с ним долгий разговор, и поэтому мне пришлось прояснить каждый момент :) - person nawfal; 04.11.2012