按ID列出List <t>中的对象,并按每个对象的duplicateCount对List进行排序</t>

时间:2011-04-14 15:09:24

标签: c# linq list sorting group-by

我有多个带对象的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>();

但结果是一个空列表。

提前致谢!

3 个答案:

答案 0 :(得分: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;

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

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);

答案 1 :(得分:1)

完成字符串,但也应该使用对象:

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);

答案 2 :(得分:0)

试一下

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