2016-09-30 3 views
0

У меня проблема, что я не уверен в лучшем способе решения. И мои «решения» приводят к очень привлекательному коду.C#: Сравнить различные наборы объектов с тем же свойством

Пример: У моей модели данных есть диваны и яблоки. И класс Дивана, и класс 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

Наилучшим решением было бы создать a 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) 
Смежные вопросы