2010-04-23 2 views
87

Я не знаю, если это возможно в Linq, но здесь идет ...Использование Linq для группы списка объектов в новый список сгруппированных список объектов

У меня есть объект:

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

I возвращает список, который может выглядеть следующим:

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 

Я попытался с помощью предложения Linq GroupBy, но это, кажется, возвращает список ключей и его не сгруппированы правильно:

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

Любая помощь будет оценена.

Благодаря

ответ

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

очень приятно, только то, что мне нужно. Спасибо. делая это, императивный путь сосет. – user1841243

+0

Работает ли он нормально? потому что я использую эти способы, не работает. objModel.tblDonars.GroupBy (t => new {t.CreatedOn.Year, t.CreatedOn.Month, t.CreatedOn.Day}). Выберите (g => new {tblDonar = g.ToList()}). К списку(); это не работает ... можете ли вы помочь ... –

+1

Приятно работать. –

24

Ваша группа заявление будет группа по идентификатору группы. Например, если вы затем напишите:

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

, который должен работать нормально. Каждая группа имеет ключ, но также содержит IGrouping<TKey, TElement>, который представляет собой коллекцию, которая позволяет выполнять итерацию членов группы. Как упоминает Ли, вы можете конвертировать каждую группу в список, если хотите, но если вы просто собираетесь перебирать их в соответствии с приведенным выше кодом, в этом нет никакой реальной выгоды.

2

Для типа

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>() }; 
Смежные вопросы