IT박스

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

itboxs 2020. 7. 8. 08:06
반응형

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


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();

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

그룹 명세서 그룹 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가 언급했듯이 실제로 원하는 경우 각 그룹을 목록으로 변환 할 수 있지만 위의 코드에 따라 그룹을 반복하면 실제로 이점이 없습니다.


유형

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>() };

참고 URL : https://stackoverflow.com/questions/2697253/using-linq-to-group-a-list-of-objects-into-a-new-grouped-list-of-list-of-objects

반응형