2017-01-02 37 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