1

別の IEnumerable から IEnumerable 型の要素を削除しようとしています。

ここで完全なリストを取得します

var tiposObj = from t in context.sistema_DocType
                               select
                                   new tgpwebged.Models.SettingsModels.TipoIndiceModel
                                   {
                                       id = t.id,
                                       tipo = t.tipoName
                                   };

                classificacaoModel.tipos = tiposObj.ToList();

そして、ここに最初から除外される部分的なリストがあります

  var tiposAtribuidosObj = from t in context.sistema_DocType
                                        join c in context.sistema_ClassificacaoTipo on t.id equals c.idTipo
                                        where c.idClassificacao == classificacaoId
                                        select new tgpwebged.Models.SettingsModels.TipoIndiceModel
                                        {
                                            id = t.id,
                                            tipo = t.tipoName
                                        };
                classificacaoModel.tiposAtribuidos = tiposAtribuidosObj.ToList();   

除外する方法は次のとおりです。

classificacaoModel.tiposNaoAtribuidos = classificacaoModel.tipos.Except(classificacaoModel.tiposAtribuidos);

最初のリストから除外される要素はありません。理由がわかりません。それらは同じ構造と同じタイプを持っています。

4

2 に答える 2

2

.NET framework has no way to compare 2 instances of TipoIndiceModel. For this you have to implement IEqualityComparer or derive from EqualityComparer.

Hint from MSDN on Except:

This interface supports only equality comparisons. Customization of comparisons for sorting and ordering is provided by the IComparer generic interface.

We recommend that you derive from the EqualityComparer class instead of implementing the IEqualityComparer interface, because the EqualityComparer class tests for equality using the IEquatable.Equals method instead of the Object.Equals method. This is consistent with the Contains, IndexOf, LastIndexOf, and Remove methods of the Dictionary class and other generic collections.

于 2012-12-12T11:18:23.047 に答える
1

それらは同じタイプである可能性がありますが、同じインスタンスではありません。

解決策は、デフォルトの参照等式ではなく、メンバーの等式を提供するためにオーバーライドEqualsすることです。TipoIndiceModel実装IEquatable<TipoIndiceModel>も検討してください!

参照:

IEquatableインターフェイス:http ://msdn.microsoft.com/en-us/library/ms131187.aspx

IEquatableを実装する場合は、Object.Equals(Object)およびGetHashCodeの基本クラスの実装もオーバーライドして、それらの動作がIEquatable.Equalsメソッドの動作と一致するようにする必要があります。

Equals()と演算子をオーバーロードするためのガイドライン== http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx

于 2012-12-12T11:16:55.133 に答える