通过ID将List 中的对象按ID分组,并按每个对象的重复计数对列表进行排序

|| 我有多个带有对象的列表。但是一个列表中的某些项目也存在于其他列表中。 我的问题是如何将所有列表的所有项目合并到一个最终列表中。因此,该列表中没有重复项,并且根据每个项目在不同列表中具有的重复项数对项目进行排序。 例 列表1:[用户1,用户2,用户3,用户4] 清单2:[user2,user4,user5] 清单3:[user4,user6] 结果:[user4,user2,user1,user3,user5,user6] (具有相同计数的用户顺序无关紧要) 我尝试过这样的事情:
List<User> finalResults = list1.Concat(list2).ToList<User>();

        var q = finalResults.GroupBy(x => x.id)
                    .Select(g => new User { name = g.First().name, count = g.Count() })
                    .OrderByDescending(usr => usr.count);

        finalResults = q.ToList<User>();
但结果是一个空列表。 提前致谢!     
已邀请:
可以像您要​​求的那样工作:
var list1 = new[] { \"u1\", \"u2\", \"u3\", \"u4\" };
var list2 = new[] { \"u2\", \"u4\", \"u5\" };
var list3 = new[] { \"u4\", \"u6\" };

var allLists = list1.Concat(list2).Concat(list3);

var result = from u in allLists
             group u by u into g
             orderby g.Count() descending 
             select g.Key;
还有一个带有对象而不是字符串的版本
var list1 = new[] { new User(\"u1\"), new User(\"u2\"), new User(\"u3\"), new User(\"u4\") };
var list2 = new[] { new User(\"u2\"), new User(\"u4\"), new User(\"u5\") };
var list3 = new[] { new User(\"u4\"), new User(\"u6\") };

var allLists = list1.Concat(list2).Concat(list3);

var result = from u in allLists
                group u by u.Name into g
                orderby g.Count() descending 
                select g.Key;
编辑:更新了代码示例
g.Key
,而不仅仅是
g
。 这是上面查询的方法链等效项:
var result = allLists
    .GroupBy(u => u.Name)
    .OrderByDescending(g => g.Count())
    .Select(g => g.Key);
    
用字符串完成,但也应该使用对象:
var l = new string[] { \"user1\", \"user2\", \"user3\", \"user4\",
    \"user2\", \"user4\", \"user5\" ,
    \"user4\", \"user6\" };

var result = l.Aggregate(new Dictionary<string, int>(),
    (res, user) =>
    { // create a dictionary of all users and their occurence
        if (!res.ContainsKey(user)) res[user] = 0;
        res[user]++;
        return res;
    }).OrderByDescending(kvp => kvp.Value) // order by incidence
    .Select(kvp => kvp.Key); // select user names only

foreach (var user in result) Console.WriteLine(user);
    
尝试这个 var result = list1.Union(list2).Union(list3).ToList();     

要回复问题请先登录注册