0

私は単純なタイプを持っていますQuestion:

public class Question
{
    public string[] Tags { get; set; }
    public DateTime Created { get; set; }
}

質問のリストがありますが、タグのリストに沿ってそれらをフィルタリングする必要があります (フィルターと呼ばれます)。フィルタ リストに一致するタグが最も多い質問は、結果コレクションの上位に配置する必要があります。そのための表現を書きました:

public IList<Question> GetSimiliar(IList<Questions> all, string[] filters)
{
    var questions = all.Select(
                        x => new 
                               { 
                                  MatchedTags = x.Tags
                                                 .Count(tag => filters.Contains(tag)), 
                                  Question = x 
                               })
                       .Where(x => x.MatchedTags > 0)
                       .OrderByDescending(x => x.MatchedTags)
                       .Select(x => x.Question);

    return questions.ToList();
}

今、同じ数の一致したタグを持つ質問が複数あるような状況のサポートが必要です。このような質問は、作成日でさらに並べ替える必要があります (新しいものから古いものへ)。

私が欲しいものの例:

フィルタ: タグ = [a,b,c]

フィルタリングする質問のコレクション:

  1. q1 { タグ = [a]、作成 = 1939 }
  2. q2 { タグ = [b]、作成 = 1945 }
  3. q3 { タグ = [a、b、c]、作成済み = 1800 }
  4. q4 { タグ = [a,b]、作成 = 2012 }
  5. q5 { タグ = [z]、作成 = 1999 }

result - ソートされたコレクション:

  1. q3
  2. q4
  3. q2
  4. q1

linq を使用してそれを行う方法は?

4

2 に答える 2

3

今、同じ数の一致したタグを持つ質問が複数あるような状況のサポートが必要です。このような質問は、作成日でさらに並べ替える必要があります (新しいものから古いものへ)。

ThenByまたはを使用ThenByDescendingして、クエリをさらに並べ替えます。これらの方法を使用して、以前の注文の関係を断ち切ります。

.OrderByDescending(x => x.MatchedTags)
.ThenByDescending(x => x.Question.Created)
.Select(x => x.Question); 
于 2012-04-06T15:35:03.990 に答える
1

101 Linq Samples ページには、ネストされたグループ化の例があります。このサンプルでは、​​group by を使用して、最初に年ごと、次に月ごとに各顧客の注文のリストを分割します。

public void Linq43() 
{ 
    List<Customer> customers = GetCustomerList(); 

    var customerOrderGroups = 
        from c in customers 
        select 
            new 
            { 
                c.CompanyName, 
                YearGroups = 
                    from o in c.Orders 
                    group o by o.OrderDate.Year into yg 
                    select 
                        new 
                        { 
                            Year = yg.Key, 
                            MonthGroups = 
                                from o in yg 
                                group o by o.OrderDate.Month into mg 
                                select new { Month = mg.Key, Orders = mg } 
                        } 
            }; 

    ObjectDumper.Write(customerOrderGroups, 3); 
} 
于 2012-04-06T15:00:24.213 に答える