【问题标题】:Is there more elegant method for multiple conditions verification是否有更优雅的多条件验证方法
【发布时间】:2013-08-08 22:07:58
【问题描述】:

案例:
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&lt;DataClass&gt;,其中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 等等。

【问题讨论】:

  • 可以修改Filter类吗?
  • @WiiMaxx,你在哪里找到了一个过滤器类?只有Filter[n] 名称的属性。
  • 当然,但是你写了“在服务器端我有这个类来获取过滤器”所以我认为filter 是来自过滤器的对象,因此我问你是否可以修改这个类
  • @WiiMaxx,是的,我可以修改它。

标签: c# conditional-statements


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    话虽如此,您可能会受益于实施像策略模式这样的设计模式,在这种模式下,您会根据情况(How does the Strategy Pattern work?)获得不同的行为(策略)。但最好先解释一下你想要达到的目标。

    【讨论】:

    • 我有一个客户报告的大联接,我从 13 个表中选择了 13 个字段(我无法更改数据结构或报告)。 DataClass 代表我的选择。我有 13 个过滤器。用户可以添加它们。用户添加过滤器后,它由可能的值加载。所以Filter1Table1 加载了可能的值。这就是原因,因为我只能将Filter1 应用于Data1。示例:我为带有“国家/地区”字段的报告选择数据。然后添加过滤器“国家”并选择值“比利时”。然后所选值应按“国家/地区”字段过滤报告。
    • 我正在努力理解你在说什么,但这很难......但据我了解,0699 给出的答案不是你可以使用的吗?
    • 你不明白我是如何描述问题的(对语言的误解)或我描述的内容(对描述的误解)?
    【解决方案3】:

    我会创建一个数组:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-03
      • 2011-06-19
      • 1970-01-01
      • 2012-01-25
      • 1970-01-01
      • 1970-01-01
      • 2022-01-27
      • 1970-01-01
      相关资源
      最近更新 更多