获取List <t>中最常见的项目并在此之后进行排序</t>

时间:2014-01-29 15:05:34

标签: c# sql .net linq

我有一个List<T>的对象/类,它已经填充了SQL数据库中的数据。我想要做的是找出这个表中最常见的用户是谁,并根据最常见的用户开始对新列表进行排序

我不知道如何在Stackoverflow上设置表格样式,所以你必须忍受我。

数据库表可以是这样的:

id - userID - randomColumn - randomColumn2
1 - 2 - ExampleText - ExampleText
2 - 2 - ExampleText - ExampleText
3 - 1 - ExampleText - ExampleText
4 - 3 - ExampleText - ExampleText
5 - 2 - ExampleText - ExampleText
6 - 1 - ExampleText - ExampleText

我想使用LINQ或SQL来格式化这个,所以我得到一个看起来像这样的列表

userID - amountColumn - randomColumn
2 - 3 - ExampleText
1 - 2 - ExampleText
3 - 1 - ExampleText

5 个答案:

答案 0 :(得分:4)

使用LINQ提供的GroupBy扩展方法。

// Pseudo code
var grouped = list.GroupBy(item => item.UserID);

然后,您可以致电OrderByDescending对结果进行排序:

var sorted = grouped.OrderByDescending(group => group.Count());

答案 1 :(得分:4)

使用linq中的GroupBy方法按用户分组,然后按用户数排序,然后选择已订购的项目。

var grouped = list.GroupBy(g => g.UserID)
                  .OrderByDescending(g => g.Count)
                  .Select(g => g);

如评论中所述,这将返回一个组列表。要将这些列入一个“平面”列表,您可以使用SelectMany

var items = grouped.SelectMany(g => g);

items将成为单个用户列表。

答案 2 :(得分:2)

您需要按userID对项目进行分组。然后通过选择分组键,组中的项目数和组中第一项的随机列的值,将每个组投影到匿名类型(或某些特定类型,如果有的话)。最后一步是按投影组的项目计数属性排序结果:

var query = list.GroupBy(u => u.userID)                  
                .Select(g => new {
                     userID = g.Key,
                     amountColumn = g.Count(),
                     randomColumn = g.First().randomColumn
                 }).OrderByDescending(x => x.amountColumn);

答案 3 :(得分:2)

您需要GroupBy功能:

users.GroupBy(n => n.userID)
   .Select(n => new {userID = n.Key, amountColumn = n.Count()})
   .OrderByDescending(n => n.amountColumn);

答案 4 :(得分:0)

SQL将是:

SELECT userID, Count(UserID) AS Total , randomColumn
FROM YourTable
GROUP BY userID,randomColumn
ORDER BY Total