我会使用 Collections 使用的方式,我的意思是基本上你应用 OrderBy 过滤器,然后应用 First 函数。
有了这个,我们有两个选择:
- 使用
IComparable<in T> 接口来利用集合的排序算法。
例子:
public class Movies
{
List<Movie> Items {get; set; }
IComparable<Movie> DefaultImplementation = new DefaultCompareImplementation();
//...
//...
public Movie bestMovie(IComparable<Movie> comparer = null)
{
var compare = comparer ?? DefaultImplementation;
return Items.Sort(compare).First()
}
}
- 使用
Func<TSource,TKey> 之类的委托和默认实现,以防用户不提供任何委托。
例子:
public class Movies
{
List<Movie> Items {get; set; }
//...
//...
public Movie bestMovie<TKey>(Func<Movie,TKey> orderBy = null)
{
var compare = orderBy ?? (movie)=> movie.Rating;
return Items.OrderBy(compare).First()
}
}
对于上面提到的strategy pattern,我会这样使用它:
IMovieSelection 接口:
public interface IMovieSelection
{
Movie FindBestMovie(IEnumerable<Movie> items);
}
ImdbRatingSelection 类:
public class ImdbRatingSelection:IMovieSelection
{
public Movie FindBestMovie(IEnumerable<Movie> items)
{
return items.OrderBy(movie=>movie.Rating).FirstOrDefault();
}
}
电影类:
public class Movies
{
public enum ImplementedStrategies{ ImdbRating }
List<Movie> Items {get; set; }
//...
//...
public Movie bestMovie(ImplementedStrategies strategy = ImplementedStrategies.ImdbRating)
{
switch(strategy)
{
case ImplementedStrategies.ImdbRating:
return new ImdbRatingSelection().FindBestMovie(Items);
default:
throw new ArgumentOutOfRangeException(nameof(strategy), strategy, null);
}
}
public Movie bestMovie(IMovieSelection customSelection)
{
return customSelection?.FindBestMovie(Items) ?? bestMovie();
}
}