Помещение значений в словарь и отображение их в текстовых полях - PullRequest
0 голосов
/ 03 июня 2018

Надеюсь, это не глупый вопрос, но я пытаюсь создать простую форму, которая имеет 2 числовых обновления, с помощью кнопки, я беру значения и сохраняю их в словаре в виде двух строк.Теперь я думаю, что все идет хорошо, но я хочу показать значения после нажатия кнопки также в отдельных текстовых полях.

namespace TestWayPointEditor
{
    public struct Coordinate
    {
    public string Latitude { get; set; }
    public string Longitude { get; set; }

    public Coordinate(string latitude, string longitude)
    {
    this.Latitude = latitude;
    this.Longitude = longitude;
    }

}
public partial class Form1 : Form
    {

    HashSet<Coordinate> WayPoints = new HashSet<Coordinate>();
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        //Set lat and lon values in a string
        string Lat = LatUpDown.Value.ToString();
        string Lon = LongUpDown.Value.ToString();

        WayPoints.Add(new Coordinate(Lat, Lon));

    }
}
}

enter image description here Моя форма выглядит следующим образом, чтобы дать представление о том, что я делаю

Так что, если у меня есть широтаи долгота и нажмите добавить, он должен появиться в текстовых полях и сохранить его на заднем плане.Если я изменю значения и нажму добавить, вторая строка должна быть заполнена, и это должно продолжаться и продолжатьсяКроме того, я хочу, чтобы, закрывая эту форму (это вторая форма проекта) и открывая ее снова, я не терял своих ценностей.

Полагаю, мне нужно сделать урок для этого, и он должен быть публичным.Но я на самом деле не знаю, с чего начать.Я надеюсь, что кто-то может руководить.

1 Ответ

0 голосов
/ 03 июня 2018

Словарь лучше подходит для данных со структурой ключ-значение, когда нам может понадобиться получить значение с помощью ключа ...

Очевидно, latitude не является ключом дляlongitude поэтому коллекция Dictionary не лучший выбор, если ключ не будет содержать что-то значимое.

Мы можем создать собственную структуру Coordinate для хранения наших значений.Примером структуры, подобной этой, является System.Drawing.Point .

public struct Coordinate
{
    public string Latitude  { get; } 
    public string Longitude { get; }

    public Coordinate(string latitude, string longitude)
    {
        this.Latitude = latitude;
        this.Longitude = longitude;
    }
}

Поскольку мы не хотим, чтобы наша коллекция позволяла добавлять одно и то же значение в два раза больше, чем List<T>либо лучший выбор.

Мы можем извлечь выгоду из использования HashSet<T>, который имеет высокопроизводительные операции над множествами и не содержит повторяющихся элементов:

HashSet<Coordinate> WayPoints = new HashSet<Coordinate>();

public Form1()
{
    InitializeComponent();
}

...

WayPoints.Add(new Coordinate(.. , ..));

Теперь, если нам нужно WayPoints длясуществуют даже после закрытия формы, мы должны переместить ее за пределы Form в какой-либо другой объект.

Если в коллекции WayPoints должны быть значения после перезапуска приложения - требуется постоянное хранениеи мы можем сериализовать и сохранить наши значения в базе данных или в файл.

Пример очень простого статического хранилища:

public static class DataStorage
{
    public static HashSet<Coordinate> WayPoints { get; }

    static DataStorage()
    {
        WayPoints = new HashSet<Coordinate>();
    }

    public static Coordinate? TryGetCoordinate(string latitude, string longitude)
    {
        var coordinate = new Coordinate(latitude, longitude);
        return WayPoints.Contains(coordinate) ? (Coordinate?)coordinate : null;
    } 
}

PS

Мы могли бы перебрать всеWayPoints с использованием foreach и присваиваем каждой координате некоторую Textbox.Text.

В случае, когда нам нужно получить определенные Coordinate из WayPoints, все, что нам нужно сделать, это создать новый экземплярCoordinate и проверьте, существует ли он в WayPoints colразночтение.Мы реализовали это в методе TryGetCoordinate.

Используйте это так:

Coordinate? foundInStorage = DataStorage.TryGetCoordinate("123.5", "300");
if(foundInStorage != null)
{
    // something with foundInStorage.Value
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...