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

时间:2012-12-12 11:12:19

标签: 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
                                   {
                                       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);

第一个列表中不排除任何元素。无法弄清楚原因。它们具有相同的结构和相同的类型。

2 个答案:

答案 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