2016-08-19 3 views
0

値。 LanguageInfoは、LanguageNameとLanguageIdのオブジェクトをさらに含むオブジェクトです。 LanguageNameとLanguageIdはオブジェクトでもあり、(最後に)文字列値を含みます。LINQ GROUPBYとそのプロパティのすべては、私は、オブジェクト(LanguageInfo)を含むオブジェクト(FilesInfo)のリストを持っている

私はグループに言語別のファイルのリストが欲しいです。 この(私は魔法を比較値/参照によるの問題を想定)は動作しません:

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

(これは私は基本的に達成しようとしているものですが)

これが行われます。

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

さて、問題は、私はLanguageInfoがLANGUAGENAMEが含まれているかどうかを知っている、または言語コード(または他の同様の特性の一つ、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オブジェクト全体でグループ化したい - リスト内の2つのファイルが同じLanguageInfoを持っている場合はグループ化する必要があります:) – Bartosz

+0

言語情報それは自分のクラスですか? –

答えて

1

があなたのUniversalLanguageInfoUniversalLanguageElementクラスのためのEquals(object)Equals<T>を実装します。

これらは、(最小化)クラスです。 GroupBy()を実行すると、探している結果が得られます。これらのメソッドの実装では、あなたの

、あなたは彼らが「同じ」であるとレベルを選択することができます。あなたが記述した場合、それは「深い等価」です。つまり、適切なEqualsを持つグラフ内のオブジェクトを除いて、グラフ全体に対して等価を実装する必要があります。各レベルですべての子供のEqualsを呼び出します。

that is good practiceと表示されているので、GetHashCode()を実装する必要があります。meJustAndrewのように実装する必要があります。 Gian Paoloは、オブジェクトグラフのクラスを変更できない場合や、一般的な等価性が普遍的に利用できないようにする場合に特に便利な、コンペアルートの作成を提案します。

+1

彼は 'GetHashCode'も必要になると思います。 – meJustAndrew

+2

またはUniversalLanguageInfoのカスタム比較関数を作成し、[this](https://msdn.microsoft.com/en-us/library/bb534334(v=vs.110).aspx)GroupByメソッドのオーバーロードを使用します –

関連する問題