2

案例:
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));
}

所以有 13if和 13 基本相同的过滤逻辑。这段代码看起来很可怕。有什么方法可以制作更漂亮的滤镜吗?

补充: Filter1 只能应用于 Data1 等等。

4

3 回答 3

0

我不完全理解您要做什么:您有 13 个过滤器类型列表,如果设置了过滤器(或由用户选择),您将获得一个单独的字符串(过滤器 1 的 fi 'data1')并尝试匹配吗?

这听起来像是你设置数据结构的方式有问题......当你看到这么多重复代码时,你认为可能会有更好的解决方案是正确的:-)也许你可以解释你的功能'正在尝试实际做什么?

话虽如此,您可能会从实施像策略模式这样的设计模式中受益,您可以根据情况获得不同的行为(策略)(策略模式如何工作?)。但是,如果您首先解释您要达到的目标,可能会更好。

于 2013-08-08T08:54:21.670 回答
0

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

于 2015-03-02T16:33:27.617 回答
0

I would create an array:

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]));
}
于 2013-08-07T13:50:44.673 回答