【问题标题】:trying to exclude elements from an IEnumerable structure using Except尝试使用 except 从 IEnumerable 结构中排除元素
【发布时间】:2012-12-12 11:12:19
【问题描述】:

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

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

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc asp.net-mvc-4


    【解决方案1】:

    .NET 框架无法比较 TipoIndiceModel 的 2 个实例。 为此,您必须实现 IEqualityComparer 或从 EqualityComparer 派生。

    来自 MSDN 的 Except 提示:

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

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

    【讨论】:

    • 实际上文章状态并没有完全描述两个实例的比较过程。我仍然不明白为什么 Equals() 和 GetHashObject() 都必须被覆盖。
    【解决方案2】:

    它们可能是同一类型,但它们不是同一个实例。

    解决方案是在TipoIndiceModel 上覆盖Equals 以提供成员相等而不是默认引用相等。也考虑实现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 的指南

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-07
      • 2017-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多