2016-09-05 2 views
6

In meiner Form Ich habe vier RadioButton s, basierend auf Benutzerauswahl wird dieser Code ausgeführt:Der beste Weg, redundanten Code mit wiederholter Logik zu behandeln?

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); 
       } 

      } 

     } 

Der Code sehr redundant und wiederholt scheint, aber auch ich kann nicht einen Weg, um all 4 Radiobuttons zu handhaben finden in einer einzigen Zeile, in der nur eine Variable mit der Benutzerauswahl verknüpft ist. myList a List einer Klasse I geschaffen, das 4 string Eigenschaften (Name, Age, Gender, Occu)

Antwort

8

Der einzige Unterschied liegt in Filter (where) alle anderen kombiniert werden können:

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); 
} 
+1

Kurze Frage sollten die Radiobutton Prüfung und Textvergleich in Klammern eingeschlossen werden oder macht es aus, nicht wahr? zB '(radioButtonName.Checked && item.Name == textBoxSearch.Text) || (radioButtonAge.Checked && item.Age == textBoxSearch.Text) ... ' – Nkosi

+1

@Nkosi: Es spielt keine Rolle im Zusammenhang; Wenn jedoch die Version mit Parentheis * für Sie * lesbarer ist, können Sie '(...)' –

+0

@Nkosi hinzufügen, siehe [diese Antwort] (http://stackoverflow.com/a/1196738/5555803). '&&' s erhalten zuerst bewertet –

1

Mit einem Wörterbuch können Sie die RadioButton gleichzeitig auf Filter abbilden. Unter der Annahme, MyClass ist die Art der Objekte in der Liste:

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); 
     } 
    } 

} 

So können Sie auf einfache Weise neuen Radio-Buttons mit einer einfachen Linie im Wörterbuch stecken können.

0

Sie könnten zuerst eine anonyme Liste Ihrer Optionsfelder erstellen und Vorhersagen erstellen und sie dann durchlaufen (MyItem ist in diesem Fall Beispiel/Platzhalter für das, was Ihre Liste enthält, da ich den tatsächlichen Klassennamen nicht kenne):

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}"); 
      } 
     } 
    } 
7

wickelt alles in einer Funktion wie diese:

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; } 

    } 
+0

Dies funktioniert nur für eine Eigenschaft 'Occu'! –

+0

@MohamedAhmed warum die down vote? überprüfe mein Update ... – raven

Verwandte Themen