1

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

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

4

2 回答 2

2

.NET 框架无法比较TipoIndiceModel. 为此,您必须实现IEqualityComparer 或从EqualityComparer.

来自 MSDN 的提示除了

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

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

于 2012-12-12T11:18:23.047 回答
1

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

解决方案是覆盖EqualsonTipoIndiceModel以提供成员相等性,而不是默认的引用相等性。也考虑实施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

于 2012-12-12T11:16:55.133 回答