2014-10-30 2 views
0

У меня есть список <> с объектами пользователя (имя пользователя (строка) и класса (строка))Создание нового списка из существующего и группы объектов

List<User> users = new List<User>(); 

Список получает заполняются значениями из БД (или Текстовый файл) и у меня есть список с 5 объектов:

user1 A 
user1 B 
user2 A 
user2 G 
user3 D 

Я хочу изменить список (или создать новый список), так что результат должен быть новый список со значениями htis:

user1 A,B 
user2 A,G 
user3 D 

Я попытался GroupBy:

var result = jquery.GroupBy(u => u.username).OrderByDescending(g => g.Count()).Select(g => g.Key); 

Но я хочу, чтобы получить результат в новый список

ответ

1

Попробуйте это: -

var query = users.GroupBy(x => x.UserName).OrderByDescending(x => x.Count()) 
             .Select(x => new { UserName = x.Key, Grades = String.Join(",", x.Select(z => z.Grade)) }); 

Работа Fiddle.

+0

Он работает очень хорошо. Итак, если я расширяю свой User Object с помощью другого элемента, скажут firstname, второе имя может работать без больших изменений? – user576914

+0

@ user576914 - Да, это зависит от того, как вы хотите группировать и какой результат вы ожидаете. –

1

Вы могли бы построил новый тип, который будет содержать информацию, которую вы хотите, как

public class UserGrade 
{ 
    // the user's name. 
    public string UserName { get; set;} 

    // a comma separated list of the grades achieved by the user. 
    public string Grades { get; set; } 
} 

Далее мы groub наших результатов по имени пользователя и мы выбираем для каждой группы BEW UserGrade объекта. Последнее мы называем ToList, для того, мы получим наш результат в виде списка:

var result = jquery.GroupBy(u => u.username) 
        .Select(x=> new UserGrade{ 
         UserName = x.Key, 
         Grades = String.Join(",",x.Select(y=>y.Grade) 
       }).ToList(); 

Примечание Вы могли бы избежать определение нового типа. В этом случае ваш список будет содержать последовательность ожиданий анонимного типа.

2

Попробуйте

var result = users 
      .GroupBy(x => x.Name) 
      .OrderByDescending(g => g.Count()) 
      .Select(g => new { Name = g.Key, Grades = string.Join(",", g.Select(x => x.Grade) }); 

Вот code sample

Смежные вопросы