案例:
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,依此类推。
答案 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)
使用表达式树。这会让你的工作更轻松。