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

問題は、ステートメントがグループ化を作成することですが、ユーザーの単純なリストを返そうとしています。

これを修正するには、次の 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()
    );

EDIT : (このコメントへの応答: 「A で始まるすべての名前が A ヘッダーの下にあるようにグループ化したいので、実際には並べ替えではなく、外観を変更するだけです」)

このような場合、グループ化は必要ありません(ただし、必要に応じてグループ化を利用できます)。代わりに、LINQ、SP、またはその他の方法でデータを注文し、異なる文字で始まる名前間の境界に挿入することで視覚的にヘッダーを提供できます。

これは、コンソールに出力するプログラムで実行する非常に大雑把な例です。少しの作業で、特定のビジュアルに適応させることができるはずです。

// 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 に答える