注意事项:字符串数组或IP地址数组
本文关键字:数组 IP 地址 注意事项 字符串 | 更新日期: 2023-09-27 18:17:11
好吧,我不确定如何做到这一点,因为我正在努力自学c#,同时创建一个工作程序。
我有一个IP地址列表,我可以将文本文件加载到主屏幕上的textBox1中,在文本框中键入IP地址列表,或者复制并粘贴到文本框中。
我想创建一个新窗口,并将IP地址列表传递到一个数组中,其中IP地址来自文本框中点击提交的列表。
我是否想将文本框中的文本发送到字符串中,在循环中一次一行地读取它并将它们作为字符串放入数组中,然后将它们作为IP地址拉出。
或者我想将文本框中的文本发送到IPAddress。解析并创建多个IP地址数组
MainWindow.xaml
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="SCA Site(s) Up Tool" Height="498" Width="321">
<Grid Margin="0,0,2,0">
<TextBlock HorizontalAlignment="Left" Margin="10,10,0,0" TextWrapping="Wrap" Text="Please Enter an IP Address for the SCA Site or Sites, below. One IP Address Per Line." VerticalAlignment="Top" Width="286"/>
<Button x:Name="submit_Main" Content="Submit" HorizontalAlignment="Left" Margin="221,426,0,0" VerticalAlignment="Top" Width="75" Click="submit_Main_Click"/>
<Button Content="Open File" HorizontalAlignment="Left" Margin="10,426,0,0" VerticalAlignment="Top" Width="75" Click="Button1_Click"/>
<TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="365" Margin="10,47,0,0" TextWrapping="Wrap" Text="" VerticalAlignment="Top" Width="286" AcceptsReturn="True" AutoWordSelection="True" AllowDrop="True" Background="#FFF0F0F0"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Forms;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
namespace WpfApplication1
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button1_Click(object sender, EventArgs e)
{
Stream myStream;
OpenFileDialog openFileDialog1 = new OpenFileDialog();
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
if ((myStream = openFileDialog1.OpenFile()) !=null)
{
string strfilename = openFileDialog1.FileName;
string filetext = File.ReadAllText(strfilename);
textBox1.Text = filetext;
}
}
}
private void submit_Main_Click(object sender, RoutedEventArgs e)
{
// Open Second Window
SecondWindow sec = new SecondWindow();
sec.Show();
this.Close();
//Pass Text of TextBox to String
}
}
}
& lt; & lt;::编辑::>>从Andrei Dvoynos那里得到一些指导,下面是我在从WPF切换到WinForm后最终处理这个表单的方法。我要把List的List留给Form2。
private void Submit_Button_Click(object sender, EventArgs e)
{
// //Pass Text of TextBox1 to String Array tempStr
List<IPAddress> addresses = new List<IPAddress>();
foreach (string input in this.textBox1.Lines)
{
IPAddress ip;
if(IPAddress.TryParse(input,out ip))
{
addresses.Add(ip);
}
else
{
MessageBox.Show("Input malformed: {0} :" + input, input + " Invalid", MessageBoxButtons.OK);
}
}
// // Loop through the array and send the contents of the array to debug window.
// for (int counter = 0; counter < addresses.Count; counter++)
// {
// System.Diagnostics.Debug.WriteLine(addresses[counter]);
// }
//close Form1, open and pass list addresses to Form2
this.Hide();
Form2 f2 = new Form2(addresses);
f2.Show();
}
我将像这样实现它:
private void submit_Main_Click(object sender, RoutedEventArgs e)
{
// Open Second Window
SecondWindow sec = new SecondWindow();
sec.Show();
this.Close();
//Pass Text of TextBox to String
List<List<IpAddress>> ipAddresses = new List<List<IpAddresses>>();
foreach(var line in textbox1.Text.split(''n')//Not 100% sure this would work, but give it a try :)
{
var list = new List<IpAddress>();
list.add(IpAddress.parse(replaceLastOctet(line, "125"));
list.add(IpAddress.parse(replaceLastOctet(line, "120"));
list.add(IpAddress.parse(replaceLastOctet(line, "115"));
list.add(IpAddress.parse(replaceLastOctet(line, "110"));
list.add(IpAddress.parse(replaceLastOctet(line, "105"));
ipAddresses.Add(list);
}
}
private string replaceLastOctet(string ipAddress, string octet)
{
//You can change this function to actually do the parsing and replacing, and return an ipaddress instead of a string
//TODO: Write the code to do this :)
}
如果是一次性的,那就没关系了。另一方面,在文本框中输入字符串和在列表菜单中显示字符串是在n层架构的用户交互层,对IP地址执行操作是在应用层。数据的存储和检索当然在数据层。
这意味着将输入字符串转换为IP地址对象本质上是根据UI层对字符串进行装箱。就数据层而言,当视图层需要数据时,它是对象序列化和反序列化。换句话说,将输入存储为IP地址对象意味着对数据存储的每次写入都需要序列化,而读取的一部分则需要反序列化。
另一方面,将输入存储为字符串意味着只有一部分输入被序列化-那些程序需要作为IP地址的输入,并且没有任何东西被反序列化[ever?]。
验证也有类似的权衡。存储字符串意味着对输入的唯一验证是格式化。存储IP地址可能意味着在输入期间进行白/黑名单验证,并且由于URL在不同时间发出不同的行为,因此在检索时进行白/黑名单验证可能是谨慎的。同样,这更多的是应用层任务,而不是UI或数据存储层。
在从数据存储读取时进行序列化会影响性能的规模下,总是可以选择缓存。但是缓存——本质上是存储作为ip地址的等价——早期并没有真正出现任何明显的好处,超过了关注点分离。
我会说只使用IPAddress.parse
,除非您不必分隔每个IP字符串,例如,ipaddress1
, ipaddress2
, ipaddress3
,你可能要做一些字符串操作,不确定IPAddress.parse
做什么,但如果你不需要操作任何东西,那么这似乎是要走的路。