c# - 使用 .Contains 保留 LINQ 的顺序

标签 c# linq

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

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

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 并仍然保留筛选列表的顺序?

如果我需要提供更多信息,请告诉我!

最佳答案

如果我理解正确,contentBasedFiltered 是有序列表,您想要来自 restaurantsCloseToUser 的原始项目,但按照它们在 contentBasedFiltered 中的顺序.所以我会尝试以下操作:

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

这将按 contentBasedFiltered 的顺序返回一个列表,但包含来自 restaurantsCloseToUser 的项目。

关于c# - 使用 .Contains 保留 LINQ 的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41425074/

相关文章:

c# - DbContext 处理?

Asp.NET MVC3 + MySQL,总是返回 null

c# - NI LabVIEW 中的 AES 加密

C# MySQLDataReader 在结果中替换

c# - Resharper 转换 LINQ 错误?还是我的代码错了

c# - o?.Value 的表达式树

c# - 如果在 LINQ 中找到,如何在最后一条记录上应用包含并删除?

c# - ienumerable <string> 到字典 <string, int>

c# - 将 float.MaxValue 转换为 Long 会抛出异常?

c# - WCF 最容易实现的安全模式