有没有更优雅的方法来验证多个条件

本文关键字:验证 条件 方法 有没有 | 更新日期: 2023-09-27 18:26:53

案例:
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等。

有没有更优雅的方法来验证多个条件

我会创建一个数组:

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

我不完全理解你想做什么:你有13个过滤器类型的列表,如果设置了过滤器(或由用户选择),你会得到一个单独的字符串(例如filter1的"data1"),并尝试在上面匹配?

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

话虽如此,你可能会从实施像战略模式这样的设计模式中受益,在这种模式中,你会根据情况获得不同的行为(战略)(战略模式是如何工作的?)。但如果你先解释一下你想要实现的目标,可能会更好。

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