LInq GroupBy by object及其所有属性值

时间:2016-08-19 13:30:14

标签: c# linq group-by

我有一个包含对象(LanguageInfo)的对象列表(FilesInfo)。 LanguageInfo是一个包含LanguageName和LanguageId的更多对象的对象。 LanguageName和LanguageId也是一个对象,(最终)包含一个字符串值。

我想按语言对文件列表进行分组。 这不起作用(我想通过比较魔术的价值/参考问题):

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; }  
}

1 个答案:

答案 0 :(得分:1)

为您的UniversalLanguageInfoUniversalLanguageElement类实施Equals(object)Equals<T>。当您执行GroupBy()时,您将获得您正在寻找的结果。

在这些方法的实现中,您可以选择它们“相等”的级别。在您描述的情况下,这是一个“深度等于”,这意味着您需要为整个图形实现等于,除了该图中的对象,您确定其中Equals是合适的。在每个级别调用所有孩子的Equals

如下面meJustAndrew所示,您必须实施GetHashCode()因为that is good practiceGian Paolo建议使用比较器路径,如果您无法修改对象图中的类或者不希望一般相等普遍可用,则该路径尤其有用。