2016-08-19 78 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方法的重载 –