2012-04-22 3 views
2

У меня есть список объектов с полем UserID, Property:Список заказов по общей стоимости недвижимости

Я хотел был бы заказать список по самой общей стоимости недвижимости. Поэтому, если у каждого пользователя есть Property = «Popular», это должно получиться первым. Если у каждого, кроме одного пользователя, есть свойство = «Второе», которое должно появиться вторым в списке ... , даже если оно используется только один раз для каждого пользователя.

Я бы сделал различные() для каждого возможного свойства, но это не кажется эффективным со многими возможными свойствами.

ответ

2

Вы можете использовать группировку по Property, Упорядочение групп по числу отсчетов в каждой группе, а затем расплющить список еще раз, используя SelectMany():

var items = myList.GroupBy(x => x.Property) 
        .OrderByDescending(g => g.Count()) 
        .SelectMany(g => g); 
        .ToList(); 

Из Вашего вопроса его не совсем ясно для меня ли вы хотите, чтобы дубликаты отображались или нет, и если вас вообще интересует UserID. Если нет, то вы можете просто выбрать ключи групп, чтобы дать вам List<string> уникальных значений свойств в нужном порядке:

var props = myList.GroupBy(x => x.Property) 
        .OrderByDescending(g => g.Count()) 
        .Select(g => g.Key); 
        .ToList(); 

Edit:

Похоже, что это было бы более, что вы на самом деле ищут - группы упорядочены по числу уникальных пользователей, обладающих данным свойством.

var props = myList.GroupBy(x => x.Property) 
        .OrderByDescending(g => g.Select(x=> x.UserID) 
              .Distinct() 
              .Count()) 
        .Select(g => g.Key); 
        .ToList(); 
+0

но это заказы на общую частоту имущества, а не на уникального пользователя. ?? – zsharp

+0

Тогда вы должны уточнить свой вопрос. Как вы хотите заказать свои элементы списка и что нужно вернуть? – BrokenGlass

+0

Обновленный ответ - * Я думаю * это то, что вы ищете. – BrokenGlass

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