2013-08-30 8 views
-3

Я пытаюсь группировать элементы из списка пользовательских объектов.GroupBy: как обрабатывать пустые группы?

Объект:

Public class MyObj 
{ 
    public string groupName{ get; set; } 
    public int year{ get; set; } 

    public MyObj(string groupName) 
    { 
     this.GroupName = groupName; 
    }  

    public MyObj(string groupName, int year) 
    { 
     this.GroupName = groupName; 
     this.Year = year; 
    } 
} 

Список:

List<MyObj> list = new List<MyObj>(); 
list.Add(new MyObj("group1", 2012)); 
list.Add(new MyObj("group1", 2013)); 
list.Add(new MyObj("group2", 2012)); 
list.Add(new MyObj("group2", 2013)); 
list.Add(new MyObj("group3")); 
list.Add(new MyObj("group3")); 

Если я что-то вроде:

IEnumerable<IGrouping<string, MyObj>> listMyObj = list.GroupBy(o => o.Year); 

"группы 3" п будет включен в списке результатов. Как я могу группировать MyObjs по году и сохранять пустой элемент «group3» в результате?

+6

Это просто не соответствует действительности - и я только что проверил это в LINQPad. Он будет включен в группировку с ключом группировки == 0 ('default (int)'). Если ключ был недействительным ссылочным или нулевым типом, он будет сгруппирован под ключ == 'null'. –

+1

Вы пробовали использовать этот код? Если вы исправите различные ошибки («год» вместо «Год», различные отсутствующие скобки, неправильный тип для listMyObj), вы должны обнаружить, что объекты, в которых вы не установили год, получают группу с ключом 0. –

+0

-1 за неправильное предположение, которое можно было легко проверить. Вы также должны предоставить компиляцию кода, если вы уже показываете образцы данных. –

ответ

1

Это странно, что вы хотите, чтобы некоторые группы принимая даже пустые, ваш запрос неправильно, потому что Where уже отфильтрованы все элементы с q.DateRealisation == DateTime.MinValue, это будет работать для вас:

var qualifs2 = lstQualifs.GroupBy(q => q.Contrat) 
         .Select(g=>g.Where(q => q.DateRealisation != DateTime.MinValue)) 
         .SelectMany(g=>g); 
0

Вы получите группу. Ключ группы будет 0, потому что default(int) == 0.

Если вы не назначаете переменную-член класса, она имеет значение по умолчанию. Для ссылочных типов это null, для псевдонимов с интегральными/с плавающей точкой, то есть 0, а для пользовательских struct s это значения, заполненные по умолчанию.

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