2016-08-19 79 views
0

我有一個包含對象(LanguageInfo)的對象列表(FilesInfo)。 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

所以我很困惑..什麼*確切*你想分組?我可能只是誤讀,但你所要求的似乎效率低下。如果一個屬於'LanguageInfo'的屬性爲null或空,那麼你希望它由另一個屬性分組?這聽起來非常混亂,與Group By的意圖相反 –

+0

@BviLLe_Kid - 我希望按整個LanguageInfo對象進行分組 - 如果列表中的兩個文件具有相同的LanguageInfo,則應將它們分組:) – Bartosz

+0

so language info是自己的班級? –

回答

1

實現您UniversalLanguageInfoUniversalLanguageElementEquals(object)Equals<T>。當你做GroupBy()你會得到你正在尋找的結果。

在您實現這些方法時,您可以選擇它們「相等」的級別。在你描述的情況下,這是一個「深度平等」,這意味着你需要爲整個圖表實現等值,除了那個圖表中的對象,你肯定有合適的Equals。每個級別都會撥打所有孩子的Equals

由於meJustAndrew低於建議,您將不得不實施GetHashCode(),因爲that is good practiceGian Paolo建議使用比較器路由,如果您無法修改對象圖中的類或不希望普遍可用的普通等式,那麼這是非常有用的。

+1

我想他也需要'GetHashCode'。 – meJustAndrew

+2

或爲'UniversalLanguageInfo'創建自定義比較器並使用[this](https://msdn.microsoft.com/en-us/library/bb534334(v = vs.110).aspx)GroupBy方法的重載 –