我希望这不是一个愚蠢的问题,但我正在尝试创建一个简单的表单,它有一个带有按钮的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));
}
}
}
My form looks like this to give an idea of what I am doing
因此,如果我有纬度和经度并按下添加它应该出现在文本框中并将其保存在背景上。如果我更改了值并按下添加,则第二行应该被填充,这应该继续。除了我想要的时候我关闭这个表格(它是第二种形式的项目)并再次打开它我没有放弃我的价值观。
我猜我必须为此开课,它应该是公开的。但我其实不知道从哪里开始。我希望有人可以指导。
答案 0 :(得分:3)
当我们可能需要使用键获取值时,字典对于具有键值结构的数据更好...
显然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;
}
}
P.S。
我们可以使用WayPoints
遍历所有foreach
并将每个坐标分配给某些Textbox.Text
。
如果我们需要从Coordinate
获得某些WayPoints
,我们需要做的就是创建Coordinate
的新实例并检查它是否存在于WayPoints
中采集。我们已经在TryGetCoordinate
方法中实现了它。
像这样使用它:
Coordinate? foundInStorage = DataStorage.TryGetCoordinate("123.5", "300");
if(foundInStorage != null)
{
// something with foundInStorage.Value
}