2011-01-14 131 views
4

基本的に私はすべてこれは、細かい作業例えばので、次の作品Linq .Except関数 "少なくとも1つのオブジェクトがIComparableを実装する必要があります。"

さIEquatable(サンプルを以下に示す)

public class ContainerClass : IEquatable<ContainerClass> 
{ 
     public IEnumerable<CustomClass> CustomClass { get; set; } 

     public override bool Equals(object obj) { ... } 
     public bool Equals(ContainerClass other) { ... } 
     public static bool operator ==(ContainerClass cc1, ContainerClass cc2) { ... } 
     public static bool operator !=(ContainerClass cc1, ContainerClass cc2) { ... } 
     public override int GetHashCode() { ... } 
} 

またIEquatable

public class CustomClass : IEquatable<CustomClass> 
{ 
     public string stringone { get; set; } 
     public string stringtwo { get; set; } 

     public override bool Equals(object obj) { ... } 
     public bool Equals(CustomClass other) { ... } 
     public static bool operator ==(CustomClass cc1, CustomClass cc2) { ... } 
     public static bool operator !=(CustomClass cc1, CustomClass cc2) { ... } 
     public override int GetHashCode() { ... } 
} 

を実装CustomClassを実装容器を有します

IEnumerable<CustomClass> customclassone = new List<CustomClass> 
    { 
     new CustomClass { stringone = "hi" }, 
     new CustomClass { stringone = "lo" } 
    }; 
IEnumerable<CustomClass> customclasstwo = new List<CustomClass> 
    { 
     new CustomClass { stringone = "hi" } 
    }; 

var diff = customclassone.Except(customclasstwo); 

ContainerClass containerclassone = new ContainerClass 
{ 
    CustomClass = customclassone.AsEnumerable() 
}; 
ContainerClass containerclasstwo = new ContainerClass 
{ 
    CustomClass = customclasstwo.AsEnumerable() 
}; 

var diff2 = containerclassone.CustomClass.Except(customclasstwo.CustomClass); 

このコードの後に​​、列挙されたdiffとdiff2の両方に、期待される結果が含まれています。私は「少なくとも1つの目的は、IComparableを実装する必要があります。」取得exceptlistを列挙しようとするただし、場合、私はその後

IEnumerable<CustomClass> oldCustom = oldContainerClass.CustomClass; 
IEnumerable<CustomClass> newcustom = newContainerClass.CustomClass; 
var exceptlist = oldCustom.Except(newcustom); 

を試してみてください。上の作業例のものとoldCustomとnewCustomの唯一の違いは、それらが移入される方法です。なぜこれが起こっているのですか?

+0

気にしない場合は、私はコードを少し凝縮して、それを読むために多くのスクロールをする必要はありません。 –

+0

'oldContatinerClass'と' newContatinerCalss'のコードを提供できますか? –

+2

問題を示す短くて完全なプログラムを制作できますか?私はこれがなぜあなたが示したコードだけで起こるのか分かりません。 (あなたはそれを実証するために==と!=演算子は必要ありません) –

答えて

13

ContainerClass.CustomClassの内容をソートしようとしたと思われます。遅延実行のために、あなたがそれを反復し、Except()がちょうど赤いニシンであるまで問題があることはわかりません。 CustomClassIComparableインターフェイスを実装していないので、ソートはそのエラーで失敗します。 CustomClassIComparable<T>インターフェースを実装するか、OrderBy()IComparerを渡す必要があります。

例えば、

oldContainerClass.CustomClass = someListOfSomeType.OrderBy(x => x.CustomClasss, myComparer) 
                .Select(x => x.CustomClass); 

それはまさにあなたがこれらのプロパティに割り当てられているかを確認するのに役立つだろうけど、私たちはあなたに、より正確な理由を与えることができます。

+1

あなたはおそらく正しいでしょう...とにかくIComparableは必要ありません –

+0

男私はダム、 CustomClassの変数のコードはorderbyにしようとしていましたが、コンプリートなし – Manatherin

+3

+1は精神的なデバッグ用です。 –