2012-01-12 3 views
5

사용자가 드롭 다운을 통해 선택하는 기준 이후에 데이터 항목을 필터링하고 정렬해야합니다. 선택할 수있는 항목은 "가장 새로운 항목을 먼저", "가장 오래된 항목을 먼저", "가장 먼저 가격을 먼저"등입니다.데이터 정렬 및 필터링을위한 디자인 패턴은 무엇입니까?

옵션을 열거하고 스위치/데이터를 검색 할 위치를 만들 수 있지만, d 이것을 쉽게 확장 할 수있는 방법으로 수행하십시오.

상황에 가장 적합한 디자인 패턴은 무엇입니까?

+1

winforms, wpf, silverlight, webforms 또는 mvc? –

+1

나는 STRATEGY 패턴이 할 것이라고 가정합니다. – VS1

+1

WebForms,하지만 일반적인 문제는 아닙니까? – magnattic

답변

3

누구나 전략 패턴을 언급했습니다. 그냥 내 간단한 구현을 게시 할 줄 알았는데. 필요한 것보다 더 복잡하게 만들 필요가 없습니다.

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); 
+0

은 우아하고 단순합니다. 감사! – magnattic

0

나는 항상 내 생각에 맞는 패턴을 명명하는 것이 좋지 않지만 초기 생각은 각 옵션에 대한 간단한 클래스를 만들고 IComparer (T)를 구현 한 다음 해당 항목을 드롭 다운 옵션으로로드하는 것이 좋습니다. 인터페이스 메소드 외에도 이름 속성 만 있으면됩니다.

0

의견에서 언급했듯이, 이것은 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); 
    } 
} 
관련 문제