Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 是否有更优雅的多条件验证方法_C#_Conditional Statements - Fatal编程技术网

C# 是否有更优雅的多条件验证方法

C# 是否有更优雅的多条件验证方法,c#,conditional-statements,C#,Conditional Statements,案例: NET MVC、C和ExtJS。用户有一个过滤器,可以选择多个值。有13个这样的过滤器,用户可以在UI中添加或删除它们 问题: 在服务器端,我有一个获取过滤器值的类: public List<string> Filter1 { get; set; } public List<string> Filter2 { get; set; } ... public List<string> Filter13 { get; set; } 然后我像这样过滤这些数据

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

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

public List<string> Filter1 { get; set; }
public List<string> Filter2 { get; set; }
...
public List<string> Filter13 { 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个基本相同的滤波器逻辑。这个代码看起来很可怕。有没有办法制造更漂亮的过滤器

增加:
过滤器1只能应用于数据1等。

我将创建一个数组:

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个filtertypes列表,如果用户设置或选择了一个筛选器,您会得到一个单独的字符串f.I.“data1”作为filter1,并尝试匹配它

这听起来像是您设置数据结构的方式出了问题。。。当您看到大量重复的代码时,您认为可能有更好的解决方案是正确的:-也许您可以解释您试图实际执行的功能


话虽如此,您可能会受益于实现类似策略模式的设计模式,在这种模式中,您可以根据情况获得不同的行为策略。但如果你先解释一下你想要达到的目标,可能会更好。

使用表达式树。这将使您的工作更轻松。

我为客户的报告找到了一个大连接,我从13个表中选择了13个字段,无法更改数据结构或报告。DataClass代表了我的选择。我有13个过滤器。用户可以添加它们。用户添加过滤器后,将按可能的值加载。所以Filter1从表1中加载了可能的值。这就是原因,因为我只能将Filter1应用于Data1。示例:我为带有“国家”字段的报告选择数据。然后添加过滤器“Country”并选择值“Belgium”。然后,所选的值将按“国家”字段筛选报告。我正试图理解您的意思,但很难。。。但据我所知,0699给出的答案不是你可以使用的吗?你不明白我是如何描述对语言的误解,或者我是如何描述对描述的误解的?你能修改过滤器类吗?@WiiMaxx,你在哪里找到过滤器类的?只有Filter[n]name的属性。当然,但是您在服务器端写了我有这个类用于获取筛选器,所以我认为筛选器是来自筛选器的对象,因此我问您是否可以修改此属性class@WiiMaxx,是的,我可以修改它。
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]));
}