사용자가 드롭 다운을 통해 선택하는 기준 이후에 데이터 항목을 필터링하고 정렬해야합니다. 선택할 수있는 항목은 "가장 새로운 항목을 먼저", "가장 오래된 항목을 먼저", "가장 먼저 가격을 먼저"등입니다.데이터 정렬 및 필터링을위한 디자인 패턴은 무엇입니까?
옵션을 열거하고 스위치/데이터를 검색 할 위치를 만들 수 있지만, d 이것을 쉽게 확장 할 수있는 방법으로 수행하십시오.
상황에 가장 적합한 디자인 패턴은 무엇입니까?
사용자가 드롭 다운을 통해 선택하는 기준 이후에 데이터 항목을 필터링하고 정렬해야합니다. 선택할 수있는 항목은 "가장 새로운 항목을 먼저", "가장 오래된 항목을 먼저", "가장 먼저 가격을 먼저"등입니다.데이터 정렬 및 필터링을위한 디자인 패턴은 무엇입니까?
옵션을 열거하고 스위치/데이터를 검색 할 위치를 만들 수 있지만, d 이것을 쉽게 확장 할 수있는 방법으로 수행하십시오.
상황에 가장 적합한 디자인 패턴은 무엇입니까?
누구나 전략 패턴을 언급했습니다. 그냥 내 간단한 구현을 게시 할 줄 알았는데. 필요한 것보다 더 복잡하게 만들 필요가 없습니다.
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);
은 우아하고 단순합니다. 감사! – magnattic
나는 항상 내 생각에 맞는 패턴을 명명하는 것이 좋지 않지만 초기 생각은 각 옵션에 대한 간단한 클래스를 만들고 IComparer (T)를 구현 한 다음 해당 항목을 드롭 다운 옵션으로로드하는 것이 좋습니다. 인터페이스 메소드 외에도 이름 속성 만 있으면됩니다.
의견에서 언급했듯이, 이것은 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);
}
}
winforms, wpf, silverlight, webforms 또는 mvc? –
나는 STRATEGY 패턴이 할 것이라고 가정합니다. – VS1
WebForms,하지만 일반적인 문제는 아닙니까? – magnattic