我希望这不是一个愚蠢的问题,但是我正在尝试创建一个简单的表单,该表单具有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
因此,如果我有经度和纬度,请按添加,它应该出现在文本框中并保存在背景中。如果我更改值并按添加,则应填充第二行,此行应不断进行。除此以外,当我关闭此表单(这是项目的第二个表单)并再次打开它时,我并没有失去自己的价值观。
我猜想我必须为此上课,并且应该公开。但是我实际上不知道从哪里开始。我希望有人可以指导。
最佳答案
当我们可能需要使用键来获取值时,字典更适合具有键值结构的数据。
显然,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/