有没有更优雅的方法来验证多个条件
本文关键字:验证 条件 方法 有没有 | 更新日期: 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"),并尝试在上面匹配?
这听起来像是你设置数据结构的方式有问题。。。当你看到这么多重复的代码时,你认为可能有更好的解决方案,这是正确的:-)也许你可以解释你试图实际做什么的功能?
话虽如此,你可能会从实施像战略模式这样的设计模式中受益,在这种模式中,你会根据情况获得不同的行为(战略)(战略模式是如何工作的?)。但如果你先解释一下你想要实现的目标,可能会更好。
使用表达式树。这会让你的工作更轻松。