Порядок IEnumerable по вхождению - PullRequest
1 голос
/ 07 апреля 2011

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

IEnumerable<Entity> results = SearchForEntities(searchCriteria);

return results.OrderByDescending(e => /* Number of occurences in results? */)
              .Distinct()
              .Take(maxSearchResults);

Любая помощь в том, что я должен поместить в выражение OrderByDescending?

Заранее спасибо! :)

edit: уточнение по запросу. Объекты, которые встречаются в коллекции более одного раза, имеют уникальный идентификатор, но являются , а не ссылками на один и тот же объект.

Ответы [ 2 ]

4 голосов
/ 07 апреля 2011
return results.GroupBy(r => r)
              .OrderByDescending(g => g.Count())
              .Select(g => g.Key)
              .Take(maxSearchResults);

Вопрос в том, содержит ли коллекция несколько сущностей с одинаковым идентификатором или на самом деле существует несколько ссылок на один и тот же объект сущности ?

Если первый случай (по идентификатору), вы можете захотеть:

return results.GroupBy(r => r.ID)
              .OrderByDescending(g => g.Count())
              .Select(g => g.First())
              .Take(maxSearchResults);
2 голосов
/ 07 апреля 2011

Попробуйте это:

IEnumerable<Entity> results = SearchForEntities(searchCriteria);

return results.OrderByDescending(e => results.Where(a=>a == e).Count())
          .Distinct()
          .Take(maxSearchResults);
...