我有多个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