C# 尝试使用Except从IEnumerable结构中排除元素

C# 尝试使用Except从IEnumerable结构中排除元素,c#,asp.net,.net,asp.net-mvc,asp.net-mvc-4,C#,Asp.net,.net,Asp.net Mvc,Asp.net Mvc 4,我正在尝试从另一个IEnumerable中删除IEnumerable类型中的元素 这是完整的清单 var tiposObj = from t in context.sistema_DocType select new tgpwebged.Models.SettingsModels.TipoIndiceModel

我正在尝试从另一个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);

第一个列表中不排除任何元素。不知道为什么。它们具有相同的结构和类型。

它们可能是相同的类型,但它们不是相同的实例

解决方案是覆盖
TipoIndiceModel
上的
Equals
,以提供成员相等,而不是默认的引用相等。考虑执行<代码> IEQuabtI/<代码>! 参考:

IEquatable接口:

如果实现IEquatable,还应该重写Object.Equals(Object)和GetHashCode的基类实现,以便它们的行为与IEquatable.Equals方法的行为一致


重载Equals()和运算符==

的指导原则。NET framework无法比较
TipoIndiceModel
的两个实例。 为此,您必须实现或派生自
EqualityComparer

来自MSDN的提示:

此接口仅支持相等比较。定制 排序和排序的比较由IComparer提供 通用接口

我们建议您从EqualityComparer类派生 而不是实现IEqualityComparer接口,因为 EqualityComparer类使用 IEquatable.Equals方法而不是Object.Equals方法。这 与Contains、IndexOf、LastIndexOf和Remove一致 Dictionary类和其他泛型类的方法 收藏


实际上,本文并没有完全描述两个实例的比较过程。我仍然不明白为什么Equals()和GetHashObject()都必须被重写。