Best way to handle redundant code with repeating logic?

In my form, I have four RadioButton s based on the user's choice, this code is executed:

 private void button1_Click(object sender, EventArgs e) { listBox1.Items.Clear(); if (radioButtonName.Checked) { var Qr = from n in mylist where n.Name == textBoxSearch.Text select new { n.Name, n.Age, n.Occu, n.Gender }; foreach (var item in Qr) { listBox1.Items.Add("Name: " + item.Name + " " + " Age: " + item.Age + " " + " Occupation: " + item.Occu + " " + " Gender: " + item.Gender); } } if (radioButtonAge.Checked) { var Qr = from n in mylist where n.Age == textBoxSearch.Text select new { n.Name, n.Age, n.Occu, n.Gender }; foreach (var item in Qr) { listBox1.Items.Add("Name: " + item.Name + " " + " Age: " + item.Age + " " + " Occupation: " + item.Occu + " " + " Gender: " + item.Gender); } } if (radioButtonGender.Checked) { var Qr = from n in mylist where n.Gender == textBoxSearch.Text select new { n.Name, n.Age, n.Occu, n.Gender }; foreach (var item in Qr) { listBox1.Items.Add("Name: " + item.Name + " " + " Age: " + item.Age + " " + " Occupation: " + item.Occu + " " + " Gender: " + item.Gender); } } if (radioButtonOccupation.Checked) { var Qr = from n in mylist where n.Occu == textBoxSearch.Text select new { n.Name, n.Age, n.Occu, n.Gender }; foreach (var item in Qr) { listBox1.Items.Add("Name: " + item.Name + " " + " Age: " + item.Age + " " + " Occupation: " + item.Occu + " " + " Gender: " + item.Gender); } } } 

The code seems very redundant and repetitive, but also I cannot find a way to process all 4 RadioButtons in one line, which has only one variable related to the user's choice. myList is a List created class I, which has 4 string properties ( Name , Age , Gender , Occu )

+6
source share
4 answers

The only difference is the filter ( where ), all the rest can be combined:

  private void button1_Click(object sender, EventArgs e) { var lines = mylist .Where(item => radioButtonName.Checked && item.Name == textBoxSearch.Text || radioButtonAge.Checked && item.Age == textBoxSearch.Text || radioButtonGender.Checked && item.Gender == textBoxSearch.Text || radioButtonOccupation.Checked && item.Occu == textBoxSearch.Text) .Select(item => string.Format("Name: {0} Age: {1} Occupation: {2} Gender: {3}", item.Name, item.Age, item.Occu, item.Gender)); listBox1.Items.Clear(); foreach (string line in lines) listBox1.Items.Add(line); } 
+8
source

wrap everything in a function like this:

 public void foo(RadioButton radioButton, Expression<Func<MyItem, bool>> expression) { if (radioButton.Checked) { var Qr = mylist.AsQueryable().Where(expression).Select(x => String.Format("Name: {0}, Age: {1}, Occ: {2}, Gender: {3}", x.Name, x.Age, x.Occu, x.Gender)).ToList(); foreach (var item in Qr) { listBox1.Items.Add(item); } } } private void button1_Click(object sender, EventArgs e) { listBox1.Items.Clear(); foo(radioButtonName, c => c.Gender == textBoxSearch.Text); foo(radioButtonAge, c => c.Age == textBoxSearch.Text); foo(radioButtonGender, c => c.Gender == textBoxSearch.Text); foo(radioButtonOccupation, c => c.Occu == textBoxSearch.Text); } public class MyItem { public String Occu { get; set; } public String Age { get; set; } public String Name { get; set; } public String Gender { get; set; } } 
+8
source

You can use the dictionary to map RadioButton to its Filter at a time. Assuming MyClass is the type of objects in your list:

 private void button1_Click(object sender, EventArgs e) { var mapping = new Dictionary<RadioButton, Func<MyClass, bool>>() { { radioButtonName , x => x.Name == textBoxSearch.Text }, { radioButtonAge, x => x.Age == textBoxSearch.Text }, { radioButtonGender, x => x.Gender == textBoxSearch.Text}, { radioButtonOccupation, x => x.Occu == textBoxSearch.Text} }; foreach(var map in mapping.Where(x=> x.Key.Checked)) { var Qr = mylist.Where(map.Value).Select(n=> new {n.Name, n.Age, n.Occu, n.Gender}); foreach (var item in Qr) { listBox1.Items.Add("Name: " + item.Name + " " + " Age: " + item.Age + " " + " Occupation: " + item.Occu + " " + " Gender: " + item.Gender); } } } 

Thus, you can easily connect new radio buttons using one simple line in the dictionary.

+1
source

First you can create an anonymous list of your switches, as well as predictions, and then iterate (MyItem in this case is the sample / placeholder for your list, since I don't know the actual class name):

  private void button1_Click(object sender, EventArgs e) { // Generate anonymous list of objects that are different var radios = new[] { new { RadioButton = radioButtonName, CallBack = new Func<MyItem, bool>(x => x.Name == textBoxSearch.Text) }, new { RadioButton = radioButtonAge, CallBack = new Func<MyItem, bool>(x => x.Age == textBoxSearch.Text) }, new { RadioButton = radioButtonGender, CallBack = new Func<MyItem, bool>(x => x.Occu == textBoxSearch.Text) }, new { RadioButton = radioButtonOccupation, CallBack = new Func<MyItem, bool>(x => x.Gender == textBoxSearch.Text) }, }; // Iterate through list and add items to ListBox1, if RadioButtton is checked listBox1.Items.Clear(); foreach (var radio in radios) { if (!radio.RadioButton.Checked) { continue; } var Qr = mylist.Where(radio.CallBack).Select(n => new { n.Name, n.Age, n.Occu, n.Gender }); foreach (var item in Qr) { listBox1.Items.Add($"Name: {item.Name} Age: {item.Age} Occupation: {item.Occu} Gender: {item.Gender}"); } } } 
0
source

All Articles