Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#字符串操作-如何删除集合中每个连接字符串的第一个元素_C#_String_Listview - Fatal编程技术网

C#字符串操作-如何删除集合中每个连接字符串的第一个元素

C#字符串操作-如何删除集合中每个连接字符串的第一个元素,c#,string,listview,C#,String,Listview,我正在基于ListView控件每行中的数据创建连接字符串。我需要弄清楚如何删除每个字符串中与ListView的一行相关的第一个元素。我如何才能做到这一点?这是一个C#winforms项目 这是我当前的代码: foreach (ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items) { string HazPackErrRow = " ";

我正在基于ListView控件每行中的数据创建连接字符串。我需要弄清楚如何删除每个字符串中与ListView的一行相关的第一个元素。我如何才能做到这一点?这是一个C#winforms项目

这是我当前的代码:

        foreach (ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
        {
            string HazPackErrRow = " ";

            foreach (ListViewItem.ListViewSubItem HazPackErrSub in HazPackErrItems.SubItems)
            {
                HazPackErrRow += " " + HazPackErrSub.Text + ",";
            }
            // Remove comma after last element of string.
            HazPackErrRow = HazPackErrRow.Substring(0, HazPackErrRow.Length - 2); 
            MessageBox.Show(HazPackErrRow); // List concatenated subitems
        }

一开始就不要加进去

foreach (ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
    {
        string HazPackErrRow = " ";

        bool first = true;
        foreach (ListViewItem.ListViewSubItem HazPackErrSub in HazPackErrItems.SubItems)
        {
            if (first) 
                first = false;
            else
                HazPackErrRow += " " + HazPackErrSub.Text + ",";
        }
        // Remove comma after last element of string.
        HazPackErrRow = HazPackErrRow.Substring(0, HazPackErrRow.Length - 2); 
        MessageBox.Show(HazPackErrRow); // List concatenated subitems
    }

一开始就不要加进去

foreach (ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
    {
        string HazPackErrRow = " ";

        bool first = true;
        foreach (ListViewItem.ListViewSubItem HazPackErrSub in HazPackErrItems.SubItems)
        {
            if (first) 
                first = false;
            else
                HazPackErrRow += " " + HazPackErrSub.Text + ",";
        }
        // Remove comma after last element of string.
        HazPackErrRow = HazPackErrRow.Substring(0, HazPackErrRow.Length - 2); 
        MessageBox.Show(HazPackErrRow); // List concatenated subitems
    }
您可以使用:

因为其他人似乎在重写您的代码,为什么我不能?=]

foreach(ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
{
    string HazPackErrRow = String.Join(", ", HazPackErrItems.SubItems.Skip(1).Select(t => t.Text).ToArray());

    MessageBox.Show(HazPackErrRow); // List concatenated subitems
}
您可以使用:

因为其他人似乎在重写您的代码,为什么我不能?=]

foreach(ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
{
    string HazPackErrRow = String.Join(", ", HazPackErrItems.SubItems.Skip(1).Select(t => t.Text).ToArray());

    MessageBox.Show(HazPackErrRow); // List concatenated subitems
}

如果我正确地理解了这个问题,您可以使用for循环,将索引从0开始改为1

如果我正确理解了这个问题,您可以使用for循环,将索引从0改为1

这是基于Inferis的答案,但它使用了StringBuilder并避免了最后的子字符串调用:

foreach (ListViewItem errors in HazmatPackageErrorListview.Items)
{
    StringBuilder builder = new StringBuilder();

    bool first = true;
    foreach (ListViewItem.ListViewSubItem error in errors.SubItems)
    {
        if (first)
        {
            first = false;
        }
        else
        {
            if (builder.Length > 0)
            {
                builder.Append(", ");
            }
            builder.Append(error.Text);
        }
    }
    MessageBox.Show(builder.ToString()); // List concatenated subitems
}
下面是解决分隔符问题的另一种方法:

foreach (ListViewItem errors in HazmatPackageErrorListview.Items)
{
    StringBuilder builder = new StringBuilder();

    bool first = true;
    string prefix = "";
    foreach (ListViewItem.ListViewSubItem error in errors.SubItems)
    {
        if (first)
        {
            first = false;
        }
        else
        {
            builder.Append(prefix);
            prefix = ", ";
            builder.Append(error.Text);
        }
    }
    MessageBox.Show(builder.ToString()); // List concatenated subitems
}
当然,有一个更简单的方法:

foreach (ListViewItem errors in HazmatPackageErrorListview.Items)
{
    string[] bits = errors.SubItems.Skip(1)
                          .Select(item => item.Text)
                          .ToArray();
    string errorLine = string.Join(", ", bits);
    MessageBox.Show(errorLine);
}

这是基于Inferis的回答,但它使用了StringBuilder并避免了最终子字符串调用的需要:

foreach (ListViewItem errors in HazmatPackageErrorListview.Items)
{
    StringBuilder builder = new StringBuilder();

    bool first = true;
    foreach (ListViewItem.ListViewSubItem error in errors.SubItems)
    {
        if (first)
        {
            first = false;
        }
        else
        {
            if (builder.Length > 0)
            {
                builder.Append(", ");
            }
            builder.Append(error.Text);
        }
    }
    MessageBox.Show(builder.ToString()); // List concatenated subitems
}
下面是解决分隔符问题的另一种方法:

foreach (ListViewItem errors in HazmatPackageErrorListview.Items)
{
    StringBuilder builder = new StringBuilder();

    bool first = true;
    string prefix = "";
    foreach (ListViewItem.ListViewSubItem error in errors.SubItems)
    {
        if (first)
        {
            first = false;
        }
        else
        {
            builder.Append(prefix);
            prefix = ", ";
            builder.Append(error.Text);
        }
    }
    MessageBox.Show(builder.ToString()); // List concatenated subitems
}
当然,有一个更简单的方法:

foreach (ListViewItem errors in HazmatPackageErrorListview.Items)
{
    string[] bits = errors.SubItems.Skip(1)
                          .Select(item => item.Text)
                          .ToArray();
    string errorLine = string.Join(", ", bits);
    MessageBox.Show(errorLine);
}

如果可以使用Linq,请使用String.Join(),这样读起来容易得多:

    foreach (ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
    {
        string HazPackErrRow = string.Join(", ", HazPackErrItems.SubItems.Skip(1).Select(s => s.Text).ToArray())

        MessageBox.Show(HazPackErrRow); // List concatenated subitems
    }

如果可以使用Linq,请使用String.Join(),这样读起来容易得多:

    foreach (ListViewItem HazPackErrItems in HazmatPackageErrorListview.Items)
    {
        string HazPackErrRow = string.Join(", ", HazPackErrItems.SubItems.Skip(1).Select(s => s.Text).ToArray())

        MessageBox.Show(HazPackErrRow); // List concatenated subitems
    }

在开始处添加逗号,那么您只需执行一次检查,而不是每次迭代都执行一次检查


string HazPackErrRow = "";
foreach (ListViewItem.ListViewSubItem HazPackErrSub in HazPackErrItems.SubItems)        
{
            HazPackErrRow +=  "," + " " + HazPackErrSub.Text;        
}
// Remove comma before first element of string.
if(HazPackErrRow.Length > 0)
 HazPackErrRow = HazPackErrRow.Substring(1);
编辑:
嗯,别理我,我看错了问题。

在开头加上逗号,那么你只需要做一次检查,而不是每次迭代都检查一次


string HazPackErrRow = "";
foreach (ListViewItem.ListViewSubItem HazPackErrSub in HazPackErrItems.SubItems)        
{
            HazPackErrRow +=  "," + " " + HazPackErrSub.Text;        
}
// Remove comma before first element of string.
if(HazPackErrRow.Length > 0)
 HazPackErrRow = HazPackErrRow.Substring(1);
编辑:
嗯,别理我,我误解了这个问题。

。。。然后重写它以使用StringBuilder:)是的,但他不是这么要求的:。。。然后重写它以使用StringBuilder:)是的,但他不是这么要求的。:)这样,字符串就以逗号开头。我正在修复:P我真的不喜欢你对我之前评论的问题的解决方案。。。看起来有点老土。我更喜欢那种方式,而不是早点把它从结尾处取下来。不过还有另一种方法。。。我会编辑。@乔恩SKET,我认为这个方法更好(我可以接受,虽然我会先中断,而不是用较大的IF)。P我真的不喜欢你对我之前评论的问题的解决方案。。。看起来有点老土。我更喜欢那种方式,而不是早点把它从结尾处取下来。不过还有另一种方法。。。我会编辑。@Jon Skeet,我认为该方法更好(我也可以接受,不过我会先中断而不是使用更大的if)。您需要调用ToArray-String。Join不适用于IEnumerable。您需要调用ToArray-String。Join不适用于IEnumerable。