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>() };
답변
여전히 오래된 것이지만 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도 포함됩니다.