是否有更优雅的方法进行多种条件验证

时间:2013-08-07 13:39:10

标签: c# conditional-statements

案例:
ASP.NET MVC,C#和ExtJS。用户有一个过滤器,他可以在其中选择多个值。有13个这样的过滤器,用户可以在UI中添加或删除。

问题:
在服务器端,我有这个类来获取过滤器值:

public List<string> Filter1 { get; set; }
public List<string> Filter2 { get; set; }
...
public List<string> Filter13 { get; set; }

然后我从数据库中选择数据并将其转换为IEnumerable<DataClass>,其中DataClass如下所示:

public string Data1 { get; set; }
public string Data2 { get; set; }
...
public string Data13 { get; set; }

然后我像这样过滤这些数据:

if (filter.Filter1 != null && filter.Filter1.Any()) {
    data = data.Where(x => filter.Filter1.Contains(x.Data1));
}
...
if (filter.Filter13 != null && filter.Filter13.Any()) {
    data = data.Where(x => filter.Filter13.Contains(x.Data13));
}

因此有13个if和13个基本相同的过滤器逻辑。这段代码看起来很糟糕。有没有办法让更漂亮的过滤器?

加了: Filter1只能应用于Data1,依此类推。

3 个答案:

答案 0 :(得分:0)

我会创建一个数组:

private static const int N = 13;

public string[] Data = new string[N];
public List<string>[] Filter = new List<string>[N];
//------------------------------------------------------------------------------
for(int i = 0; i < N; i++)
{
    if(filter.Filter[i] != null && filter.Filter[i].Any()) {
        data = data.Where(x => filter.Filter[i].Contains(x.Data[i]));
}

答案 1 :(得分:0)

我并不完全明白你要做的事情:你有13个过滤类型列表,如果设置过滤器(或由用户选择),你会得到一个单独的字符串(fi'data1'用于过滤器1并尝试匹配?

这听起来像你开始设置数据结构的方式有点错误......你认为当你看到这么多重复代码时可能有更好的解决方案是正确的:-)也许你可以解释一下这个功能您正在尝试做什么?

话虽如此,您可能会受益于实施类似策略模式的设计模式,您可以根据情况获得不同的行为(策略)(How does the Strategy Pattern work?)。但如果你先解释一下你想要达到的目标,那可能会更好。

答案 2 :(得分:0)

使用表达式树。这会让你的工作更轻松。