使用.Contains使用LINQ保留订单

时间:2017-01-02 10:30:17

标签: c# linq

我已阅读this关于在列表中保留订单的问题,但我没有看到有关使用.Contains()方法的任何信息,因此我提出这个问题的原因。< / p>

我创建了一个包装类,它可以包含不同的对象,如下所示:

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并仍保留已过滤列表的顺序?

如果我需要提供更多信息,请与我们联系!

1 个答案:

答案 0 :(得分:3)

如果我理解正确,contentBasedFiltered是有序列表,您希望restaurantsCloseToUser中的原始项目按照contentBasedFiltered中的顺序排列。所以我尝试以下方法:

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

这会按照contentBasedFiltered的顺序返回一个列表,但会使用restaurantsCloseToUser中的项目。