我有多个带对象的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>();
但结果是一个空列表。
提前致谢!
答案 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();