按ID对List <T>中的对象进行分组,并按每个对象的duplicateCount对List进行排序

Thd*_*hdK 3 c# linq sorting group-by list

我有多个List对象.但是一个列表中的一些项目也存在于其他列表中.我的问题是如何将所有列表中的所有项目合并到一个最终列表中.因此,该列表中没有重复项,并且项目按每个项目在不同列表中的重复项数排序.

List1:[users1,user2,user3,user4]
List2:[user2,user4,user5]
List3:[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>();
Run Code Online (Sandbox Code Playgroud)

但结果是一个空列表.

提前致谢!

Mik*_*erg 5

这将像你要求的那样工作:

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;
Run Code Online (Sandbox Code Playgroud)

还有一个带有对象而不是字符串的版本

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;
Run Code Online (Sandbox Code Playgroud)

编辑:更新了代码g.Key而非仅更新的代码示例g.

这里是上面查询的方法链等价物:

var result = allLists
    .GroupBy(u => u.Name)
    .OrderByDescending(g => g.Count())
    .Select(g => g.Key);
Run Code Online (Sandbox Code Playgroud)