我希望这不是一个愚蠢的问题,但是我正在尝试创建一个简单的表单,该表单具有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));

    }
}
}


c# - 将值放入字典并在文本框中显示它们-LMLPHP
My form looks like this to give an idea of what I am doing

因此,如果我有经度和纬度,请按添加,它应该出现在文本框中并保存在背景中。如果我更改值并按添加,则应填充第二行,此行应不断进行。除此以外,当我关闭此表单(这是项目的第二个表单)并再次打开它时,我并没有失去自己的价值观。

我猜想我必须为此上课,并且应该公开。但是我实际上不知道从哪里开始。我希望有人可以指导。

最佳答案

当我们可能需要使用键来获取值时,字典更适合具有键值结构的数据。

显然,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;
    }
}


附言

我们可以使用WayPoints遍历所有foreach并将每个坐标分配给某个Textbox.Text

如果需要从Coordinate中获取某些WayPoints,我们要做的就是创建Coordinate的新实例,并检查它是否存在于WayPoints集合中。我们已经在方法TryGetCoordinate中实现了它。

像这样使用它:

Coordinate? foundInStorage = DataStorage.TryGetCoordinate("123.5", "300");
if(foundInStorage != null)
{
    // something with foundInStorage.Value
}

关于c# - 将值放入字典并在文本框中显示它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50664495/

10-09 16:16