2016-09-30 172 views
0

我有一个问题,我不确定最佳解决方法。而我的“解决方案”正在导致非常复杂的代码。C#:比较具有相同属性的不同对象集

例如:我的数据模型有沙发和苹果。 Sofa类和Apple类都有一个IsFavorite属性和一个FavoriteChange日期。我有我使用像这样的一个服务:

List<Apple> top25FavApples = _appleService.FindFavorites(25); 
List<Sofa> top25FavSofas = _sofaService.FindFavorites(25); 

现在,我有我的苹果和沙发被收藏,我需要聚集的集合,排序FavoriteChangeDate,然后限制到前25名。这是我卡住了。

可能的解决方案:创建一个中介类来容纳Apple/Sofa和FavoriteDate。在中间对象的集合上执行选择,然后运行另一个查询以自行取回苹果和沙发。

+6

你可以让Apple和Sofa继承一个'IFavoratable'接口。 – Abion47

回答

2

最好的解决办法来创造一个IFavoriteable接口,该接口定义FavoriteChangeDate属性并让这两个类实现它。然后你可以投到IFavoriteable并在其上做一个Linq OrderBy

class Program 
{ 
    static void Main() 
    { 
     List<Apple> top25FavApples = _appleService.FindFavorites(25); 
     List<Sofa> top25FavSofas = _sofaService.FindFavorites(25); 

     List<IFavoriteable> top25Total = top25FavApples.Concat<IFavoriteable>(top25FavSofas) 
                 .OrderBy(x => x.FavoriteChangeDate) 
                 .Take(25).ToList(); 

    } 
} 

public interface IFavoriteable 
{ 
    DateTime? FavoriteChangeDate { get; } 
} 

public class Apple : IFavoriteable 
{ 
    public DateTime? FavoriteChangeDate { get; set; } 
    //... 
} 

public class Sofa : IFavoriteable 
{ 
    public DateTime? FavoriteChangeDate { get; set; } 
    //... 
} 
0

如果不能增加一些接口或基类(这将是更好的)一个选择是转换为动态的,查询在时尚动感,如:

top25FavApples.Cast<dynamic>() 
    .Concat(top25Sofas.Cast<dynamic>()) 
    .OrderBy(x => (DateTime)x.FavoriteChangeDate).Take(25) 
相关问题