2016-09-30 213 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) 
相關問題