2016-12-13 68 views
3

我正在推薦的算法,一切正常。但是現在我想將這些代碼實現到我的開發團隊的分支中。不同類型的對象填充列表

我會從頭開始。我的算法可以推薦2種類型的對象,餐廳和菜餚。

餐廳:

public class Restaurant 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public Address Address { get; set; } 
    public List<Tag> Tags { get; set; } = new List<Tag>(); 
    public int PriceRange { get; set; } 
} 

而且菜:

public class Dish 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public double Price { get; set; } 
    public virtual Restaurant rest { get; set; } 
    [ForeignKey("rest")] 
    public Guid RestaurantId { get; set; } 
    public List<Tag> Tags { get; set; } 
} 

現在我的產品負責人希望該列表是這樣的,當它被我們的應用程序的主頁上提出:

[Restaurant][Dish][Restaurant][Dish] Etc... 

所以基本上,他想交替推薦的對象類型。這些菜餚和餐館是完全分開的。它們是由我的算法純粹根據用戶的喜好生成的,與其他人完全沒有關係。

現在我的問題是如何返回這樣的列表。我想我需要一個包裝類,其中包含無論是RestaurantDish這樣的:

public class RecommenderItem 
{ 
    public Restaurant rest { get; set; } 
    public Dish dish { get; set; } 
} 

這樣我可以創建一個List<RecommenderItem>並返回給客戶端。客戶端只需要檢查哪個屬性爲null,並從不是的那個中檢索值。我只是不確定這是否是正確的方法。這樣做有沒有什麼「最佳做法」?讓我知道我是否應該詳細說明一下!

+0

我個人倒有兩類實現它公開共享屬性,如'Id'接口和'Name'(例如'Tags')並創建一個該接口的列表(該接口也可以暴露一個'Type'用於交替) –

+2

RecommenderItem'聽起來像是完全正確的解決方案,因爲它出現了這是一個菜單列表,每個菜單都與一家餐館相關聯。你的返回類型應該反映出來,就像它一樣。 –

+0

@ Me.Name但客戶端想要顯示來自每個對象的所有數據,是不是會導致問題? – RandomStranger

回答

2

如果它們沒有公共基類,那麼創建一個包裝類是最好的解決方案。同時,你可以更加靈活,創造類似

public class RecommendationItem 
{ 
    public Guid Id { get; set; } 
    public string Name { get; set; } 
    public string PageUrl { get; set; } 
    public object Entity { get; set; } 
} 

所以,你可以對這個類中的所有公共信息和客戶端將不被要求檢查與反對他的作品類型。在這種情況下,添加一個項目類型會更容易。在同一類型中,我添加了對實體本身的引用 - 如果需要對一種或兩種項目類型進行特定處理,可以使用它。

+0

啊,所以我將不得不檢查哪種類型的實體是相應的? – RandomStranger

0

如果你打算連接成對的元素,它總是對我有意義......好吧,將元素配對。我假設每道菜都是特定的餐廳?所以名單將是[餐廳1] [餐廳1的餐廳] [餐廳2] [餐廳2的餐廳] ...?

我喜歡oryol創建一個通用的基類以前的答案。

所以,你的RecommenderItem類很好。但是填寫這兩個屬性並將對的列表傳回。通過創建一個新的列表,將列表展開成完整的項目集合,遍歷RecommenderItems列表並添加每個條目中的Restaurant和Dish。

+0

雖然他們不是成對的。菜餚和餐館是完全分開的。我的算法純粹根據用戶的信息生成這些建議。我的產品所有者只想在用戶的主頁上替換這些類型。 – RandomStranger

+0

啊!那麼這就是我第二次猜測的結果! – Brian

1

你可以聲明接口IRecommenderItem:

public interface IRecommenderItem 
{ 
    //shared properties 
} 

public class Restaurant : IRecommenderItem 
{ 

} 

public class Dish : IRecommenderItem 
{ 

} 

比,你可以輸入:

List<IRecommenderItem> m = new List<IRecommenderItem>();