C# 尝试使用Except从IEnumerable结构中排除元素
我正在尝试从另一个IEnumerable中删除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
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()都必须被重写。