注意事项:字符串数组或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();
        }

注意事项:字符串数组或IP地址数组

我将像这样实现它:

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做什么,但如果你不需要操作任何东西,那么这似乎是要走的路。