试图精简我的c#

本文关键字:我的 | 更新日期: 2023-09-27 18:06:49

我试图压缩我的c#代码,因为它太长了,我觉得我可以使用foreach循环。如果我的术语或词汇不正确,请原谅,我是一个小程序员,还在摸索。

我的代码片段:

if (sender == LinkButtonA)
{
   Session["LastNameFilter"] = "A";
}
if (sender == LinkButtonB)
{
   Session["LastNameFilter"] = "B";
}
if (sender == LinkButtonC)
{
   Session["LastNameFilter"] = "C";
}
if (sender == LinkButtonD)
{
   Session["LastNameFilter"] = "D";
}

等等……

基本上,它正在改变过滤器,以便我可以在RadGrid中显示我的"患者",并根据他们的姓氏过滤他们。但是正如你所看到的,我必须有26个if语句才能使它工作。这是一种更干净的方式吗?

试图精简我的c#

您可以使用字典将按钮映射到过滤器:

static Dictionary<Button, string> mapping = new Dictionary<Button, string>() {
    { LinkButtonA, "A" },
    { LinkButtonB, "B" },
    { LinkButtonC, "C" },
    { LinkButtonD, "D" },
};
...
Session["LastNameFilter"] = mapping[sender];

Dictionary<Button,string>中注册您的按钮:

Dictionary<Button,string> lastNameFilterByButton = new Dictionary<Button,string>()`
mapping.Add(LinkButtonA, "A");
mapping.Add(LinkButtonB, "B");
mapping.Add(LinkButtonC, "C");
mapping.Add(LinkButtonD, "D");
// ...    
Session["LastNameFilter"] = lastNameFilterByButton[sender]

将按钮的Tag属性设置为适当的字符串,然后将会话值设置为标签:

// in the designer file
LinkButtonA.Tag = "A";
LinkButtonB.Tag = "B";
// etc.
// in the event
var btn = sender as LinkButton;
if (btn != null)
   Session["LastNameFilter"] = (string)btn.Tag;

编辑:标签是在WinForms控件上发现的,ASP控件没有直接的等价物。你可能可以安全地使用CommandArgument属性,虽然,如果你不使用它的其他任何东西(如Jason Nesbitt指出)。

您也可以使用按钮的名称(Session["LastNameFilter"] = btn.Name.Substring(btn.Name.Length-1, 1);)。这为您省去了处理标签的麻烦,但意味着如果更改命名约定,一切都会中断。

// Is sender of type Control?
Dictionary<Control, string> lookupBasedOnButton = new Dictionary<Control, string>()
{
    { LinkButtonA, "A" },
    // etc
};
Session["LastNameFilter"] = lookupBasedOnButton(sender);

根据您的需要,您可能需要添加错误处理(例如,检查条目是否在字典中,而不是在不在字典中抛出)。

存储并从LinkButton的CommandArgument属性中获取值

  <asp:LinkButton runat="server" ID="LinkButtonA" CommandArgument="A" OnClick="LinkButtonA_OnClick"></asp:LinkButton>
    protected void lb LinkButtonA_OnClick(object sender, EventArgs e)
    {
        var lb = (LinkButton) sender;
        Session["LastNameFilter"] = lb.CommandArgument;
    }

如果您能够将过滤器值添加为按钮的命令参数,那么您只需要这样做(适用于web表单LinkButton):

public void LinkButtonClicked(object sender, EventArgs e){
    var linkButton = (LinkButton)sender;
    Session["LastNameFilter"] = linkButton.CommandArgument;
}