2016-08-19 2 views
0

У меня есть список объектов (FilesInfo), содержащих объекты (LanguageInfo). LanguageInfo - это объект, который содержит дополнительные объекты для LanguageName и LanguageId. LanguageName и LanguageId также являются объектом, который (наконец) содержит строковое значение.LInq GroupBy по объекту и всем его значениям свойств

Я хочу сгруппировать список файлов по языку. Это не работает (я полагаю, на вопрос по стоимости/эталонным сравнения магии):

var languageGroupings = data.FilesList.GroupBy(ufi => ufi.LanguageInfo); 

(хотя это то, что я по существу пытается достичь)

Это делает:

var languageGroupings = data.FilesList.GroupBy(ufi => ufi.LanguageInfo.LanguageName.Value); 

Теперь проблема заключается в том, что я не знаю, будет ли LanguageInfo содержать LanguageName или LanguageCode (или одно из других подобных свойств, ClientLanguageName, ClientLanguageCode), поэтому я в основном хочу сгруппировать файлы на основе всех значения свойств вложенные в LanguageInfo.

Как это сделать?

Это (уменьшенные) классов:

public class UniversalLanguageInfo 
{ 
    public int UniversalLanguageInfoId { get; set; } 
    public UniversalDataElement LanguageCode { get; set; } 
    public UniversalDataElement LanguageId { get; set; } 
    public UniversalDataElement LanguageName { get; set; } 
    public UniversalDataElement ClientLanguageCode { get; set; } 
    public UniversalDataElement ClientLanguageName { get; set; } 
} 

public class UniversalDataElement 
{ 
    public string Value { get; set; }   
    public DataFormats DataSource { get; set; } 
    public string OriginalName { get; set; } 
    public bool IsExcluded { get; set; }  
} 

public class UniversalFileInfo 
{ 
    public virtual UniversalDataFormat UniversalDataFormat { get; set; } 
    public UniversalLanguageInfo LanguageInfo { get; set; } 
    public UniversalDataElement FileName { get; set; } 
    public UniversalDataElement Id { get; set; } 
    public UniversalWordcount Wordcount { get; set; } 
} 
+0

Так что я смущен .. что * точно * вы хотите Group By? Возможно, я просто неправильно понял, но то, что вы просите, кажется неэффективным .. Если свойство, находящееся под 'LanguageInfo', является нулевым или пустым, вы хотите, чтобы оно группировалось по другому свойству? Это звучит крайне дезорганизованно и противоположно тому, что Group By предназначено для –

+0

@BviLLe_Kid - я хочу группировать весь объект LanguageInfo - если два файла в списке имеют одну и ту же языковую информацию, то их следует сгруппировать :) – Bartosz

+0

так что информация о языке это собственный класс? –

ответ

1

Реализовать Equals(object) и Equals<T> для ваших UniversalLanguageInfo и UniversalLanguageElement классов. Когда вы сделаете GroupBy(), вы получите результаты, которые вы ищете.

В ваших реализациях этих методов вы можете выбрать уровень, на котором они «равны». В случае, который вы описываете, это «глубокие равные», что означает, что вам нужно реализовать equals для всего графика, за исключением объектов на этом графе, которые вы уверены в подходящем Equals. На каждом уровне звоните Equals всех детей.

Как предлагает meJustAndrew, вам необходимо будет реализовать GetHashCode(), потому что that is good practice. Gian Paolo предлагает маршрут сравнения, что особенно полезно, если вы не можете изменять классы в графе объектов или не хотите, чтобы общее равенство было общедоступным.

+1

Думаю, ему понадобится 'GetHashCode'. – meJustAndrew

+2

или создать свой пользовательский сопоставитель для 'UniversalLanguageInfo' и использовать [this] (https://msdn.microsoft.com/en-us/library/bb534334 (v = vs.110) .aspx) перегрузка метода GroupBy –

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