1

我正在返回一个语句,该语句让许多用户显示所有已经按字母顺序排列的用户。我想显示这个结果,还增加了将所有以相同字母开头的名称分组在一起的能力,这样我就可以为其创建某种标签或索引。

代码:

return new UserService().GetUsers(id.Value, pageNumber: _pageNum).GroupBy(x=>x.Name.Substring(0,1));

问题:return 语句抛出一个错误,说明:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Linq.IGrouping<string,ProjectName.Shared.Models.Views.User>>' to 'System.Collections.Generic.IEnumerable<ProjectName.Shared.Models.Views.User>'. An explicit conversion exists (are you missing a cast?)  

我该如何解决这个问题?

4

4 回答 4

2

问题是该语句创建了一个分组,但您试图返回一个简单的用户列表。

有两种方法可以解决这个问题:

  • 您可能想要返回一个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
}
于 2013-09-10T14:27:57.457 回答
1

您需要从方法中返回适当的类型:

public IEnumerable<IGrouping<string, User>> GetUserIndex()
{
    return new UserService().GetUsers(id.Value, pageNumber: _pageNum).GroupBy(x=>x.Name.Substring(0,1));
}

然后你可以像这样迭代每个组:

var userIndex = GetUserIndex();

foreach(var group in userIndex)
{
    string currentLetter = group.Key;
    foreach(User user in group)
    {
        //do something
    }
}
于 2013-09-10T14:34:56.990 回答
0

你说你有一个方法,你希望它返回如下内容:

return new UserService()
         .GetUsers(id.Value, pageNumber: _pageNum)
         .GroupBy(x=>x.Name.Substring(0,1));

根据您收到的编译器错误,很明显您的方法看起来像这样:

public IEnumerable<ProjectName.Shared.Models.Views.User> GetTheUsers() {
    // do something here...

    return new UserService()
             .GetUsers(id.Value, pageNumber: _pageNum)
             .GroupBy(x=>x.Name.Substring(0,1));
}

你不能那样做。让它像你最初设计的那样,没有分组:

public IEnumerable<ProjectName.Shared.Models.Views.User> GetTheUsers() {
    // do something here...

    return new UserService().GetUsers(id.Value, pageNumber: _pageNum);
}

然后,当你调用它时,当场进行分组:

public void Foo() {
    // do something here...

    var ungroupedUsers = GetTheUsers();

    var groupedUsers = ungroupedUsers.GroupBy(x=>x.Name.Substring(0,1))

    // and now use the groupedUsers accordingly

}
于 2013-09-10T14:31:36.690 回答
0

问题:return 语句抛出一个错误,说明:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<System.Linq.IGrouping<string,ProjectName.Shared.Models.Views.User>>' to 'System.Collections.Generic.IEnumerable<ProjectName.Shared.Models.Views.User>'. An explicit conversion exists (are you missing a cast?)

我该如何解决这个问题?

尝试这个:

    return new UserService()
            .GetUsers(id.Value, pageNumber: _pageNum)
            .GroupBy(x=>x.Name.Substring(0,1))
            .Select(g=>g); //<-----
于 2013-09-10T14:25:29.367 回答