Linq를 사용하여 객체 목록을 새로운 그룹화 된 객체 목록으로 그룹화


149

Linq에서 이것이 가능한지 모르겠지만 여기에 있습니다 ...

나는 물건을 가지고있다 :

public class User
{
  public int UserID { get; set; }
  public string UserName { get; set; }
  public int GroupID { get; set; }
}

다음과 같은 목록을 반환합니다.

List<User> userList = new List<User>();
userList.Add( new User { UserID = 1, UserName = "UserOne", GroupID = 1 } );
userList.Add( new User { UserID = 2, UserName = "UserTwo", GroupID = 1 } );
userList.Add( new User { UserID = 3, UserName = "UserThree", GroupID = 2 } );
userList.Add( new User { UserID = 4, UserName = "UserFour", GroupID = 1 } );
userList.Add( new User { UserID = 5, UserName = "UserFive", GroupID = 3 } );
userList.Add( new User { UserID = 6, UserName = "UserSix", GroupID = 3 } );

위의 목록에서 Linq 쿼리를 실행하여 모든 사용자를 GroupID로 그룹화하고 싶습니다. 따라서 출력은 사용자를 포함하는 사용자 목록의 목록이됩니다 (그렇다면 의미가 있습니까?). 다음과 같은 것 :

GroupedUserList
    UserList
        UserID = 1, UserName = "UserOne", GroupID = 1
        UserID = 2, UserName = "UserTwo", GroupID = 1
        UserID = 4, UserName = "UserFour", GroupID = 1
    UserList
        UserID = 3, UserName = "UserThree", GroupID = 2
    UserList
        UserID = 5, UserName = "UserFive", GroupID = 3
        UserID = 6, UserName = "UserSix", GroupID = 3

groupby linq 절을 사용하려고 시도했지만 키 목록을 반환하는 것으로 보이며 키 그룹이 올바르게 그룹화되지 않은 것 같습니다.

var groupedCustomerList = userList.GroupBy( u => u.GroupID ).ToList();

답변:


309
var groupedCustomerList = userList
    .GroupBy(u => u.GroupID)
    .Select(grp => grp.ToList())
    .ToList();

1
아주 좋은 것, 내가 필요한 것. 감사합니다. 이 작업을 수행하는 것이 필수적입니다.
user1841243

1
잘 작동합니까? 나는이 방법으로 작동하지 않았기 때문에. objModel.tblDonars.GroupBy (t => new {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}). Select (g => new {tblDonar = g.ToList ()}). ToList ( ); 이것은 작동하지 않습니다 ... 당신은 도울 수 ....
Rajamohan Anguchamy

귀하의 솔루션을 사용하면 정상적으로 작동하지만 그룹에서 최대 8 값까지 가정하는 한 가지 질문이 있으며 6 개로 모든 그룹에서 필요로하므로 원하는 방법을 알려주십시오.
coderwill 2012 년

GroupID별로 그룹화 한 후 UserNames 및 UserID를 별도로 나열하는 방법이 있습니까? -groupID 1의 경우 { "1", [1, 2, 4], [ "UserOne", "UserTwo", "UserFour"]}}
Ajay Aradhya

1
현재 코드가 작동하지 않으며 이전 유형의 목록으로 캐스트하려고하면 오류가 발생합니다. select in List를 반환하면 목록에 원하는 출력이 아닌 목록이 목록으로 만들어집니다. 문제가있는 사람들을 위해 제안 할 수 있습니다 : var groupedCustomerList = userList.GroupBy (u => u.GroupID) .Select (grp => grp.First ()). ToList ();
별칭

36

그룹 명세서 그룹 ID별로 그룹화됩니다. 예를 들어, 다음과 같이 쓰는 경우 :

foreach (var group in groupedCustomerList)
{
    Console.WriteLine("Group {0}", group.Key);
    foreach (var user in group)
    {
        Console.WriteLine("  {0}", user.UserName);
    }
}

잘 작동합니다. 각 그룹 에는 키가 있지만 IGrouping<TKey, TElement>그룹의 멤버를 반복 할 수있는 컬렉션 인 키도 포함합니다 . Lee가 언급했듯이 실제로 원하는 경우 각 그룹을 목록으로 변환 할 수 있지만 위의 코드에 따라 그룹을 반복하면 실제로 이점이 없습니다.


4

유형

public class KeyValue
{
    public string KeyCol { get; set; }
    public string ValueCol { get; set; }
}

수집

var wordList = new Model.DTO.KeyValue[] {
    new Model.DTO.KeyValue {KeyCol="key1", ValueCol="value1" },
    new Model.DTO.KeyValue {KeyCol="key2", ValueCol="value1" },
    new Model.DTO.KeyValue {KeyCol="key3", ValueCol="value2" },
    new Model.DTO.KeyValue {KeyCol="key4", ValueCol="value2" },
    new Model.DTO.KeyValue {KeyCol="key5", ValueCol="value3" },
    new Model.DTO.KeyValue {KeyCol="key6", ValueCol="value4" }
};

linq 쿼리는 아래와 같습니다

var query =from m in wordList group m.KeyCol by m.ValueCol into g
select new { Name = g.Key, KeyCols = g.ToList() };

또는 아래와 같은 목록 대신 배열

var query =from m in wordList group m.KeyCol by m.ValueCol into g
select new { Name = g.Key, KeyCols = g.ToList().ToArray<string>() };

-1

여전히 오래된 것이지만 Lee의 대답으로 그룹을 얻지 못했습니다. 따라서 다음 문을 사용하여 목록을 그룹화하고 그룹화 된 목록을 반환합니다.

public IOrderedEnumerable<IGrouping<string, User>> groupedCustomerList;

groupedCustomerList =
        from User in userList
        group User by User.GroupID into newGroup
        orderby newGroup.Key
        select newGroup;

각 그룹에는 이제 키가 있지만 그룹의 멤버를 반복 할 수있는 컬렉션 인 IGrouping도 포함됩니다.


이것은 OP의 질문이 아닌 귀하의 질문에 대답 합니다 . 그들은 목록의 목록만을 원합니다. 귀하의 코드는이를 제공하지 않습니다.
거트 아놀드

@ JohnSkeet의 답변에 표시된 것처럼 그룹화 된 목록을 반복 할 때 요소를 제공 하지 않으므로 @Lee에서 위의 허용 된 답변이 반복 할 때 작동하지 않기 때문에이 솔루션을 게시했습니다 group.key. 내 대답 반복 할 때 group.key 요소를 제공합니다. 따라서 제공된 응답이 위와 같이 작동하지 않는 다른 함정에 빠질 수 있습니다. 따라서 수락 된 답변과 비슷한 group.key 요소를 얻는 이점을 사용하여 목록을 얻는 또 다른 방법입니다. @GertArnold의 주장을 이해하지 마십시오. (.net core 3.0)
datapool

나는 전체 질문이 무엇인지 이해하지 못하는 것에 근거한다고 생각합니다 IGrouping. 그렇기 때문에 OP가 맨 아래에 올바른 코드를 버리는 이유는 본질적으로 코드와 동일 합니다. 그래서 그들이 원하는 것을 정확하게 제공하는 답변을 받아들입니다. 그들이 필요한 것은 JS가 충분히 제공 한 설명입니다.
게르트 아놀드
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.