Я не знаю, возможно ли это в 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();
Ваша групповая выписка будет группироваться по идентификатору группы. Например, если вы тогда напишите:
это должно работать нормально. Каждая группа имеет ключ, но также содержит
IGrouping<TKey, TElement>
коллекцию, которая позволяет перебирать членов группы. Как упоминает Ли, вы можете преобразовать каждую группу в список, если вы действительно этого хотите, но если вы просто собираетесь их перебирать в соответствии с приведенным выше кодом, в этом нет никакой реальной выгоды.источник
Для типа
коллекция
наш запрос linq выглядит как ниже
или для массива вместо списка, как показано ниже
источник
Все еще старый, но ответ от Ли не дал мне группу. Ключ как результат. Поэтому я использую следующий оператор для группировки списка и возврата сгруппированного списка:
Каждая группа теперь имеет ключ, но также содержит IGrouping, которая представляет собой коллекцию, позволяющую перебирать членов группы.
источник
group.key
элемент при итерации по сгруппированному списку, как показано в ответе @JohnSkeet. Мой ответ при условии , действительно обеспечивает элемент group.key когда итерация. Таким образом, это может помочь другим попасть в ловушку, что предоставленные ответы не работают, как показано выше. Так что это просто еще один способ получить список с преимуществом получения элемента group.key, аналогичного принятому ответу. Не понимаю ваше требование @GertArnold. (.net core 3.0)IGrouping
есть. Вот почему OP отбрасывает свой собственный правильный код внизу, который по сути идентичен вашему коду. Вот почему они принимают ответ, который обеспечивает именно то, что они просят. Что им нужно, так это объяснение, которое JS в достаточной мере предоставило.