【问题标题】:Which design pattern for ordering and filtering data?排序和过滤数据的设计模式是什么?
【发布时间】:2012-01-13 00:05:05
【问题描述】:

我需要根据用户通过下拉菜单选择的条件过滤和排序数据条目。可选择诸如“最新条目优先”、“最旧条目优先”、“最低价格优先”等内容。

我可以为检索数据的选项和开关/案例创建一个枚举,但我宁愿以一种易于扩展的方式这样做。

哪种设计模式最适合这种情况?

【问题讨论】:

  • winforms、wpf、silverlight、webforms 还是 mvc?
  • 我想 STRATEGY 模式会做..
  • WebForms,但这不是一个普遍的问题吗?
  • 是的,这是一个通用问题,与 UI 无关

标签: c# design-patterns


【解决方案1】:

大家都提到了策略模式。只是想我会发布我的简单实现。没有必要让它变得比必要的更复杂。

public enum SortMethod
{
    Newest,
    Oldest,
    LowestPrice,
}

public class Foo
{
    public DateTime Date {get;set;}
    public decimal Price {get;set;}
}


...
var strategyMap = new Dictionary<SortMethod, Func<IEnumerable<Foo>, IEnumerable<Foo>>>
                  {
                      { SortMethod.Newest, x => x.OrderBy(y => y.Date) },
                      { SortMethod.Oldest, x => x.OrderByDescending(y => y.Date) },
                      { SortMethod.LowestPrice, x => x.OrderBy(y => y.Price) }
                  };

...
var unsorted = new List<Foo>
               {
                   new Foo { Date = new DateTime(2012, 1, 3), Price = 10m },
                   new Foo { Date = new DateTime(2012, 1, 1), Price = 30m },
                   new Foo { Date = new DateTime(2012, 1, 2), Price = 20m }
               };

var sorted = strategyMap[SortMethod.LowestPrice](unsorted);

【讨论】:

    【解决方案2】:

    我并不总是擅长命名适合我想法的正确模式,但我最初的想法是为什么不为每个选项创建一个简单的类并实现 IComparer(T),然后将这些项目作为下拉选项加载。除了接口方法之外,您可能只需要一个名称属性。

    public class NameSorter: IComparer<WhateverObj>
    {
    public String DisplayName;    
    
    public int Compare(WhateverObj x, WhateverObj y)
    {
    
    }
    }
    

    【讨论】:

      【解决方案3】:

      正如 cmets 中所述,这听起来像是 Strategy pattern 的工作。您会认出这是 .NET 框架中的重要功能。

      这是一个使用 IComparer 的示例,或者我更喜欢使用 3.5 中的 LINQ 扩展方法。您仍然需要向基类添加一个工厂样式的方法,以确定它应该使用哪个比较器,或者您可以将其作为数据的一部分存储在下拉列表中。

      static void Main(string[] args)
      {
      
          List<User> users = new List<User>();
          users.Add(new User() { Name = "Larry", Age = 35 });
          users.Add(new User() { Name = "Bob", Age = 25 });
          users.Add(new User() { Name = "Brian", Age = 30 });
      
          NameComparer sorter = new NameComparer();
          IEnumerable<User> sortedUsers = sorter.Sort(users);
      
          NameComparer35 sorter35 = new NameComparer35();
          IEnumerable<User> sortedUsers35 = sorter35.Sort(users);
      }
      
      public abstract class MyComparer<T> : IComparer<T> where T: User
      {
          public abstract int Compare(T x, T y);
      
          public IEnumerable<T> Sort(IEnumerable<T> items)
          {
              items.ToList().Sort(this);
              return items;
          }
      }
      
      public abstract class MyComparer35<T> where T : User
      {
          public abstract IEnumerable<T> Sort(IEnumerable<T> items);
      }
      
      public class NameComparer35 : MyComparer35<User>
      {
          public override IEnumerable<User> Sort(IEnumerable<User> items)
          {
              return items.OrderBy(u => u.Name);
          }
      }
      
      public class NameComparer : MyComparer<User>
      {
          public override int Compare(User x, User y)
          {
              return x.Name.CompareTo(y.Name);
          }
      }
      
      public class AgeComparer : MyComparer<User>
      {
          public override int Compare(User x, User y)
          {
              return x.Age.CompareTo(y.Age);
          }
      }
      
      public class User
      {
          public string Name { get; set; }
          public int Age { get; set; }
      
          public override string ToString()
          {
              return string.Format("{0} {1}", Name, Age);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多