处理重复逻辑的冗余代码的最佳方法是什么?

时间:2016-09-05 19:53:06

标签: c# linq loops if-statement

在我的表单中,我有四个RadioButton,根据用户选择,执行此代码:

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

            }

        }

代码似乎非常冗余和重复,但我也找不到一种方法来处理一行中只有一个链接到用户选择的变量的所有4个RadioButton。 myList是我创建的类的List,其中包含4个string属性(NameAgeGenderOccu

4 个答案:

答案 0 :(得分:9)

将所有内容包装在像这样的函数中:

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

    }

答案 1 :(得分:8)

唯一的区别在于过滤器where)所有其他可以合并:

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

答案 2 :(得分:1)

您可以使用字典一次性将RadioButton映射到其Filter。假设MyClass是列表中的对象类型:

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

}

通过这种方式,您可以使用字典中的一个简单行轻松插入新的单选按钮。

答案 3 :(得分:0)

您可以先生成单选按钮的匿名列表以及预测位置,然后迭代它(MyItem在这种情况下是您的列表包含的样本/占位符,因为我不知道实际的类名称):< / p>

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