2010-04-23 16 views
87

nie wiem czy jest to możliwe w Linq ale tu idzie ...użyciu LINQ do grupy listę obiektów do nowej listy zgrupowane listy obiektów

mam obiektu:

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

wrócę listę, która może wyglądać następująco:

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

Chcę móc uruchomić kwerendę Linq na powyższej liście, że grupy wszystkich użytkowników, by GroupID. Zatem wyjście będzie listą list użytkowników zawierających użytkownika (jeśli to ma sens?). Coś jak:

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 

Próbowałem przy użyciu klauzuli linq GroupBy ale wydaje się to zwróci listę kluczy i jej nie pogrupowane poprawnie:

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

Każda pomoc będzie mile widziane.

Dzięki

Odpowiedz

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

bardzo ładne, właśnie to, czego potrzebowałem. Dziękuję Ci. robi to w sposób imperatywny do bani. – user1841243

+0

Czy działa poprawnie? ponieważ jestem używany w ten sposób nie działa. objModel.tblDonars.GroupBy (t => new {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}). Wybierz (g => nowy {tblDonar = g.ToList()}). Notować(); to nie działa ... możesz pomóc .... –

+1

Miło działa dobrze. –

24

Twoja wypowiedź grupa będzie grupa przez ID grupy. Na przykład, jeśli następnie napiszesz:

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

, które powinno działać poprawnie. Każda grupa ma klucz, ale zawiera także IGrouping<TKey, TElement>, która jest kolekcją, która pozwala na iterowanie nad członkami grupy. Jak wspomina Lee, możesz przekonwertować każdą z grup na listę, jeśli naprawdę chcesz, ale jeśli zamierzasz ją powtórzyć zgodnie z powyższym kodem, nie ma w tym żadnej realnej korzyści.

2

Dla typu

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

kolekcja

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" } 
}; 

nasz wygląd zapytań LINQ jak poniżej

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

lub na tablicy zamiast liście, jak poniżej

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