2017-01-02 67 views
1

我已閱讀this關於在列表中保留順序的問題,但我沒有看到有關使用.Contains()方法的任何內容,因此我爲什麼要問這個問題。使用.Contains保留與LINQ的訂單

我已經創建了一個包裝類可包含不同對象,如以下:

public class RecommenderItem 
{ 
    public Guid Id { get; set; } 
    public object Entity { get; set; } 
} 

我有哪些訂單的列表,而不管對象的類型的方法。在我調用命令此列表的方法之前,我從數據庫中檢索對象並將它們映射到RecommenderItem。在列出這個列表後,我想將這些項目作爲原始類型返回。

我已成功完成此操作,但爲了便於閱讀,我希望在我的整個方法中使用LINQ。目前,我建立我的輸出列表如下:

var filteredOnContent = ContentBasedFilter.FilterBasedOnContent(ratedItems, itemsNotReviewed); //This is the function which orders the list. Both ratedItems and itemsNotReviewed are lists of RecommenderItems 
var restaurantObjects = (from S1 in filteredOnContent 
         from S2 in restaurantsCloseToUser 
         where S1.Id == S2.Id 
         select S2).ToList(); 

在這個例子中是restaurantsCloseToUser已經從數據庫中檢索列表。

我已經嘗試了以下,但它不保留已過濾列表的順序。這是非常重要的,因爲該列表是建議的前10名。

var test = restaurantsCloseToUser.Where(x => contentBasedFiltered.Select(r => r.Id).Contains(x.Id)).ToList(); 

有沒有辦法可以使用LINQ,仍然保留過濾列表的順序?

如果我需要提供更多信息,請讓我知道!

+0

'test'與未經過濾的'restaurantsCloseToUser'的順序相同。您是否需要'contentBasedFiltered'的順序? – dasblinkenlight

+0

「filteredOnContent」的查詢是什麼?查詢是否被排序?我沒有看到爲什麼它的順序應該改變,因爲你只是添加另一個過濾器... –

+1

唯一能夠「銷燬」順序的是toDictionary和toLookup或者重新定義「order by」。如果你想要一個列表的順序,用它作爲「基礎」,並選擇另一個列表中的元素。 list.select ordre將保持不變 –

回答

3

如果我理解正確,contentBasedFiltered是有序列表,並且您想要restaurantsCloseToUser中的原始項目,但是按照它們在contentBasedFiltered中的順序排列。所以我想嘗試以下方法:

var test = contentBasedFiltered.Select(x => restaurantsCloseToUser.FirstOrDefault(r => r.Id == x.Id)).ToList(); 

這在contentBasedFiltered爲了但從restaurantsCloseToUser的物品返回一個列表。

+0

@dasblinkenlight我同意我的答案缺乏一些錯誤處理,但正確的方式依賴於OP的要求太多。由於這兩個列表是由OP描述的,所以不應該有不匹配的id,所以如果存在的話我不能決定該怎麼做。即使'Single()'可能是合適的,如果拋出這種特殊情況是最安全的事情。 –

+0

「restaurantsBasedFiltered」列表中的項目* always *存在於「restaurantsCloseToUser」列表中,所以此功能完美無缺,謝謝! (對不起,如果問題似乎令人困惑,應該指定我想保留'contentBasedFiltered'列表的順序。) – RandomStranger