2017-01-02 13 views
1

私は.Contains()の方法を使用することについて何も見なかったので、なぜこの質問をしているのですか?thisのリストを保持するという質問がありました。.LINQを使用して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によって2つのリストが記述されているので、一致しないIDは存在しないはずです。したがって、もしあれば何をすべきかを決めることはできません。特別なケースを投げ込むのが最も安全な方法であれば、Single()も適切です。 –

+0

'contentBasedFiltered'リストの項目は常に' restaurantsCloseToUser'リストにありますので、これは完全に動作します、ありがとうございます! (申し訳ありませんが、疑問が混乱しているようでしたら、指定したはずですが、私は 'contentBasedFiltered'リストから注文したかったと思います)。 – RandomStranger

関連する問題