我正在尝试从另一个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);
第一个列表中不排除任何元素。无法弄清楚原因。它们具有相同的结构和相同的类型。
答案 0 :(得分:2)
.NET框架无法比较TipoIndiceModel
的2个实例。
为此,您必须实施IEqualityComparer或从EqualityComparer
派生。
来自Except的MSDN提示:
此接口仅支持相等比较。定制 IComparer提供了排序和排序的比较 通用接口。
我们建议您从EqualityComparer类派生 而不是实现IEqualityComparer接口,因为 EqualityComparer类使用。来测试相等性 IEquatable.Equals方法而不是Object.Equals方法。这个 与Contains,IndexOf,LastIndexOf和Remove一致 Dictionary类和其他泛型的方法 集合。
答案 1 :(得分:1)
它们可能是同一类型,但它们不是同一个实例。
解决方案是覆盖Equals
上的TipoIndiceModel
以提供成员相等性而不是默认引用相等性。考虑实施IEquatable<TipoIndiceModel>
!
参考:
IEquatable接口:http://msdn.microsoft.com/en-us/library/ms131187.aspx
如果实现IEquatable,还应该覆盖Object.Equals(Object)和GetHashCode的基类实现,以使它们的行为与IEquatable.Equals方法的行为一致。
重载等于()和运算符指南== http://msdn.microsoft.com/en-us/library/ms173147%28v=vs.80%29.aspx