【问题标题】:Splitting a string into 3 different arrays将字符串拆分为 3 个不同的数组
【发布时间】:2019-04-29 13:49:16
【问题描述】:

我从串口收到一个字符串回复,这个回复包含 3 个不同的值。每个值都用';' 分隔。 例如;

10;155.4587;0.01

我需要将这些值分开并添加到 Listview 框中。

我找到了Split(';') 函数的示例,但我认为不可能将拆分值分配给不同的数组。

有没有办法通过使用/不使用 split() 函数来执行此提取?

提前感谢您的帮助。

【问题讨论】:

  • 你想要 3 个数组,每个数组 1 个元素吗?
  • 您应该使用regular expression。见Regex
  • @CaptainWibble 是的。我有一个 Listview 对象,其中包含名为 TD、AD、CT 的三列。从示例回复 10 应该存储到 TD155.4587 应该存储到 AD 列和 0.01 应存储到 CT 列。
  • 字符串上的 Linq Select 不返回一个字符数组吗? 'x' 不是字符串,它是原始字符串的 IEnumerable,每个 x 都是下一个字符?类似的东西...

标签: c# arrays string


【解决方案1】:

有多种方法可以做到这一点,您可以使用Regex 来分隔每个项目并使用 Lambda 函数。

你可以做一些更基本的事情,比如操作下面的冗长示例:

string s = "10;155.4587;0.01";
string[] a = new String[1];
string[] b = new String[1];
string[] c = new String[1];

string[] z = s.Split(';');

for(int i=0; i< z.Length; i++)
{
    switch(i)
    {
        case 0:
            a[0] = z[i];
            break;
        case 1:
            b[0] = z[i];
            break;
        case 2:
            c[0] = z[i];
            break;

    }
}

Console.WriteLine(a[0] + ' ' + b[0] + ' ' + c[0]);

以上说明了如何操作元素,但不能很好地扩展您可能希望使用 lambda 进行第一条评论的匿名路线(请参阅 mukesh kudi 的回答)。

【讨论】:

    【解决方案2】:

    假设输入字符串数组...

            string[] a1 = new string[] {
                "10; 155.4587; 0.01",
                "20; 255.4587; 0.02",
                "30; 355.4587; 0.03",
            };
    
            List<string> r1 = new List<string>();
            List<string> r2 = new List<string>();
            List<string> r3 = new List<string>();
    
            foreach (string t1 in a1)
            {
                string[] t2 = t1.Split(";");
                r1.Add(t2[0]);
                r2.Add(t2[1]);
                r3.Add(t2[2]);
            }
    

    【讨论】:

      【解决方案3】:

      编辑 要仅添加一个列表视图项,请使用:

       var s = "10;155.4587;0.01";
       var values = s.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
      
       var listViewItem = new ListViewItem(values[0]);
       listViewItem.SubItems.Add(values[1]);
       listViewItem.SubItems.Add(values[2]);
       listView1.Items.Add(listViewItem);
      

      假设您有多个字符串来填充列表框,请尝试:

               ListView listView1 = new ListView();
               listView1.Bounds = new Rectangle(new Point(10, 10), new Size(300, 200));
               listView1.View = View.Details;
               listView1.GridLines = true;
               listView1.Columns.Add("TD");
               listView1.Columns.Add("AD");
               listView1.Columns.Add("CT", -2);
               var sValues = new string[] { "10;155.4587;0.01", "11;156.4587;0.02", "12;157.4587;0.03" };
               var values = sValues.Select(x => x.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
                                 .Select(x =>
                                 {
                                    var listViewItem = new ListViewItem(x[0]);
                                    listViewItem.SubItems.Add(x[1]);
                                    listViewItem.SubItems.Add(x[2]);
                                    return listViewItem;
                                 });
               listView1.Items.AddRange(values.ToArray());
      

      【讨论】:

      • 这是通过解码字符串的条款来工作的,但是当我尝试将字符串传递给它时编译器会出错。你知道为什么吗? (我将代码的相关部分添加到问题中)
      • @TeoLaferla,我已经编辑了帖子以包含您需要的内容。
      • 现在第一个回复被解码并放入 Listview 但当第二个字符串出现时,它会引发对 values[1] 行的期望,即 System.IndexOutOfRangeException: 'Index was outside the bounds of the array。
      • 调试代码并检查传入的字符串。其中可能没有;
      • @TeoLaferla,如果字符串中没有;,会发生什么?
      【解决方案4】:

      你可以在 linq 的帮助下得到这个...

      string s = "10;155.4587;0.01";
      var arrList = s.Split(';').Select(x => new string[] { x }).ToArray();
      

      这里 arrList 包含三个数组。但我不确定这将如何帮助你。如果要将此结果与 ListView 绑定,则必须遍历此集合并获取每个数组值并绑定到 listview。您可以通过遍历它的索引来对单个数组执行此操作。

      【讨论】:

      • 请您详细说明一下好吗?也许有一些代码?我是 C# 的新手。
      【解决方案5】:

      感谢所有帮助。 在@Captain Wibble 的建议下,我成功解码了我的回复并添加到 Listview 项目中。

      这是我为遇到同样麻烦的人所做的; 首先我添加了我的数据包“\r\n”

      10;12.2345;0.01\r\n

      我用过;

      serial.ReadLine()

      接收传入数据的函数。 将数据解码并存储到我使用的列表视图对象中;

           var s = text;
              string[] a = new String[3];
              //string[] b = new String[1];
              //string[] c = new String[1];
      
              string[] z = s.Split(';');
      
              for (int i = 0; i < z.Length; i++)
              {
                  switch (i)
                  {
                      case 0:
                          a[0] = z[i];
                          break;
                      case 1:
                          a[1] = z[i];
                          break;
                      case 2:
                          a[2] = z[i];
                          break;
      
                  }
              }
      
              itm = new ListViewItem(a);
              listView5.Items.Add(itm);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-09
        • 2017-07-16
        • 2017-11-08
        • 2016-06-27
        • 1970-01-01
        • 2012-04-08
        相关资源
        最近更新 更多