[英]LInq GroupBy by object and all of its properties values
我有一個包含對象(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; }
}
為您的UniversalLanguageInfo
和UniversalLanguageElement
類實現Equals(object)
和Equals<T>
。 當您執行GroupBy()
您將得到想要的結果。
在這些方法的實現中,您可以選擇它們“相等”的級別。 在您描述的情況下,這是一個“深度等於”,這意味着您需要為整個圖實現等於,除非該圖中的對象確定您具有適合的Equals
。 在每個級別上,召集所有孩子Equals
。
正如下面的meJustAndrew所建議的那樣,您將必須實現GetHashCode()
因為這是一種好習慣 。 吉安·保羅 ( Gian Paolo)建議采用比較器路線,這在您無法修改對象圖中的類或不希望通用等式普遍可用時特別有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.