2017-01-02 2 views
1

Я прочитал this вопрос о сохранении заказа в списке, но я ничего не видел в использовании метода .Contains(), поэтому я задаю этот вопрос.Сохранение заказа с использованием LINQ с использованием .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 и сохранить порядок отфильтрованного списка?

Пожалуйста, дайте мне знать, если мне нужно предоставить дополнительную информацию!

+0

'test' в том же порядке, что и нефильтрованные' рестораныCloseToUser'. Вам нужен порядок 'contentBasedFiltered' вместо этого? – dasblinkenlight

+0

Что такое запрос 'filterOnContent'? Запрос упорядочен? Я не вижу причины, почему заказ должен измениться, так как вы просто добавляете еще один фильтр ... –

+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, не должно быть несоответствующего идентификатора, поэтому я не могу решить, что делать, если есть. Даже «Single()» может быть уместным, если бросить в этом специальном случае самую безопасную вещь. –

+0

Элементы в списке 'contentBasedFiltered' * всегда * существуют в списке' restaurantsCloseToUser', поэтому это отлично работает, спасибо! (Извините, если вопрос казался запутанным, должен был указать, что я хотел сохранить заказ в списке «contentBasedFiltered».) – RandomStranger

Смежные вопросы