按 id 对列表中的对象进行分组<T>,并按重复计数对每个对象的列表进行排序



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

例子

List1: [users1, user2, user3, user4]
List2: [user2, user4, user5]
List3 (user4, user6):

result: [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);

Try This

var result = list1.Union(list2).Union(list3).ToList();

相关内容

  • 没有找到相关文章

最新更新