2012-04-06 3 views
0

У меня есть простой тип Question:коллекция Упорядочение в группе разделов с помощью LINQ

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(); 
} 

Теперь мне нужна поддержка для такой ситуации, когда у меня есть более чем на один вопрос с тем же количеством соответствующих тегов. Такие вопросы следует сортировать по дате создания (от новейшей до самой старой).

Пример того, что я хочу:

фильтр: метки = [а, б, в]

сборник вопросов для фильтрации:

  1. q1 {метки = [а], создано = 1939}
  2. q2 {метки = [Ь], созданный = 1945}
  3. q3 {метки = [а, Ь, с], создано = 1800}
  4. Q4 { метки = [а, Ь], созданные = 2012}
  5. Q5 {метки = [г], создано = 1999}

результат - отсортированная коллекция:

  1. д3
  2. Q4
  3. q2
  4. q1

Как сделать это USIN g linq?

+0

downvoter, вы серьезно? – jwaliszko

ответ

3

Теперь мне нужна поддержка для такой ситуации, когда у меня есть более чем на один вопрос с такое же количество совпадающих тегов. Такие вопросы должны быть отсортировано по по дате создания (от новейшей до старой).

Используйте ThenBy или ThenByDescending, чтобы отсортировать запрос. Используйте эти методы для разрыва связей в предварительном порядке.

.OrderByDescending(x => x.MatchedTags) 
.ThenByDescending(x => x.Question.Created) 
.Select(x => x.Question); 
1

101 Linq Samples page имеет nested grouping example. Этот пример использует группу, чтобы разделить список заказов каждого клиента, первый в году, а затем месяц:

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); 
}