问题是该语句创建了一个分组,但您试图返回一个简单的用户列表。
有两种方法可以解决这个问题:
- 您可能想要返回一个
IDictionary<string,IList<User>>
而不是IEnumerable<User>
(您也可以char
用作键),或者
- 如果您想返回一个普通列表,您可能希望按名称而不是分组对用户进行排序。
这是你如何使它成为IDictionary<string,IList<User>>
:
IDictionary<string,IList<User>> res = new UserService()
.GetUsers(id.Value, pageNumber: _pageNum)
.GroupBy(x=>x.Name.Substring(0,1))
.ToDictionary(
g => g.Key
, g => (IList<User>)g.ToList()
);
编辑:(回应此评论:“我想分组,以便所有以 A 开头的名称都在 A 标题下,依此类推,所以我只是改变外观而不是真正排序”)
在这种情况下,您不需要分组(尽管如果您愿意,当然可以使用它)。您可以改为在 LINQ、SP 或其他方式中对数据进行排序,然后通过在以不同字母开头的名称之间的边界处插入 then 来直观地提供标题。
这是一个在打印到控制台的程序中执行此操作的非常粗略的示例。您应该能够通过很少的工作使其适应您的特定视觉效果:
// I assume that you know how to write the GetUsersSortedByName method
IList<User> sortedUsers = GetUsersSortedByName();
char? lastSeenFirstLetter = null;
// The loop below assumes that there are no users with empty names
foreach (User u in sortedUsers) {
if (u.Name[0] != lastSeenFirstLetter) {
Console.WriteLine("==== Header: users with names in {0}", u.Name[0]);
lastSeenFirstLetter = u.Name[0];
}
Console.WriteLine(u); // Finally, display the user
}