I have a listbox that has contents that look like this:
C44 EXCLUDES 237.910 193.469 0 0603_5
C45 EXCLUDES 244.102 193.387 0 0603_5
R47 EXCLUDES 226.935 179.519 90 0402_2
C18 CAP-00129G 230.960 190.619 0 0402_4
C17 CAP-00129G 250.085 198.569 90 0402_3
C25 CAP-00130G 255.635 189.669 90 0402_3
C56 EXCLUDES 229.430 189.374 0 0402_4
R42 EXCLUDES 241.010 192.194 90 TANT3216
R10 EXCLUDES 246.560 203.894 0 0402_9
On the click of a button, I would like to "REMOVE ENDINGS" and re-upload it to the ListBox.
So the new ListBox would look like this:
C44 EXCLUDES 237.910 193.469 0
C45 EXCLUDES 244.102 193.387 0
R47 EXCLUDES 226.935 179.519 90
C18 CAP-00129G 230.960 190.619 0
C17 CAP-00129G 250.085 198.569 90
C25 CAP-00130G 255.635 189.669 90
C56 EXCLUDES 229.430 189.374 0
R42 EXCLUDES 241.010 192.194 90
R10 EXCLUDES 246.560 203.894 0
All of the possibly endings are in this REGEX:
Regex placementOneRegex = new Regex(@"(RES|0402|0201|0603|0805|1206|1306|1608|3216|2551|1913|1313|2513|5125|2525|5619|3813|1508|6431|2512|1505|2208|1005|1010|2010|0505|0705|1020|1812|2225|5764|4532|1210|0816|0363|SOT)");
CODE:
private void removeEndingsButton_Click(object sender, EventArgs e)
{
string[] items;
System.Windows.Forms.ListBox.ObjectCollection contents = placementOneListBox.Items;
foreach (string str in contents)
{
Regex placementOneRegex = new Regex(@"(RES|0402|0201|0603|0805|1206|1306|1608|3216|2551"
+ @"|1913|1313|2513|5125|2525|5619|3813|1508|6431|2512|1505|2208|1005|1010|2010|0505|0705"
+ @"|1020|1812|2225|5764|4532|1210|0816|0363|SOT)");
items = str.Split(' ');
items[5].Replace(placementOneRegex.ToString(), "");
placementOneListBox.Items.Equals(items);
}
As you can probably tell.. this is not the best away to go about it. I think it would be easiest to string.Split()
and then just join all the split
's except the split[5]
... except I do not know how to go about doing this..
QUESTIONS:
- How do I grab each line in the listbox and remove the last piece of data (using
string.Split()
)?
- Is there an easier way to do this?
Will something like this work? I didn't test it.
private void removeEndingsButton_Click(object sender, EventArgs e)
{
string[] items;
System.Windows.Forms.ListBox.ObjectCollection contents = placementOneListBox.Items;
foreach (string str in contents)
{
List<string> list = str.Split(' ').ToList();
if(list.Count == 6)
{
string remove = list[5];
list.Remove(remove);
placementOneListBox.Items.Equals(list.ToArray());
}
}
}
if those are tabs you might want to try '\t' in the split method.
private void removeEndingsButton_Click(object sender, EventArgs e)
{
string[] items;
char[] splitChars = new char[] {'\t', ' '};
int fieldCount;
int lineCount = 0;
System.Windows.Forms.ListBox.ObjectCollection contents = placementOneListBox.Items;
foreach (string str in contents)
{
lineCount++;
items = str.Split(splitChars, StringSplitOptions.RemoveEmptyEntries);
fieldCount = items.Length;
placementOneListBox.Items[lineCount] = string.Join(" ", items.Take(fieldCount - 1).ToArray());
}
}
Looking at your data I'm thinking that you could use a string position to remove the endings. It looks like you want to truncate each entry after the 33rd position.
Are all the lines in this format?
Not perfect, but it does what you are looking for essentially. You have to tweak the Join to make it output how you want.
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Remove_Click(object sender, EventArgs e)
{
ListBox.ObjectCollection collection = placementOneListBox.Items;
// New collection to store our modified data
List<string> newCollection = new List<string>();
// We need regex to account for 0 or more spaces between items in the array.
Regex r = new Regex(" +");
foreach (string item in collection)
{
// use the regex we created to split the item into an array, it splits it based on any number of spaces.
string[] splitItem = r.Split(item);
// We had to write an extension method that "removes" at a particular index.
splitItem = splitItem.RemoveAt(5);
// Put it back together again. might have to mess with this to make it output correctly
string updatedItem = String.Join(" ", splitItem);
// add new item to collection
newCollection.Add(updatedItem);
}
// clear the existing stuff in the listbox collection
placementOneListBox.Items.Clear();
// we can use a List<T> as a data source so that's what were doing here.
placementOneListBox.DataSource = newCollection;
}
}
EDIT: Put this code in it's own class as is.
public static class ExtensionMethods
{
// An extension method to remove an index from an array, it works with any value type
public static T[] RemoveAt<T>(this T[] source, int index)
{
if (source == null)
throw new ArgumentNullException();
if (index < 0 || index > source.Length)
throw new IndexOutOfRangeException();
T[] dest = new T[source.Length - 1];
if (index != 0)
Array.Copy(source, 0, dest, 0, index - 1);
if (index != source.Length)
Array.Copy(source, index + 1, dest, index, source.Length - index - 1);
return dest;
}
}
EDIT: Don't use my previous one, I had to fix the extension method, it wasn't working when the specified index to be removed was 0 or the length of the array.