使用IEqualityComparer来基于C#中的两个属性生成一个不同的列表

我正在尝试生成一个由两个字符串串联而成的项目列表框。我创建了一个实现IEqualityComparer的类,并且希望使此列表与众不同。

private void PopulateFamily()
    {
        var source = _mfgOrdersData
            .Select(o => new FamilySelector(o.ItemWrapper.ItemClass, o.ItemWrapper.Family))
            .Distinct()
            .OrderBy(f => f.CodeFamily)
            .ToList();

        FamilyFilterListBox.DataSource = source;
        FamilyFilterListBox.ValueMember = "Family";
        FamilyFilterListBox.DisplayMember = "CodeFamily";
    }

class FamilySelector : IEqualityComparer<FamilySelector>
{
    public FamilySelector(string code, string family)
    {
        Code = code;
        Family = family;
    }

    public string Code { get; set; }
    public string Family { get; set; }
    public string CodeFamily { get { return string.Format("{0}\t{1}", Code, Family); } }

    public bool Equals(FamilySelector x, FamilySelector y)
    {
        return x.Code == y.Code && x.Family == y.Family;
    }

    public int GetHashCode(FamilySelector obj)
    {
        return obj.Code.GetHashCode() ^ obj.Family.GetHashCode();
    }
}

问题是我得到的清单不明确。同一项目出现多次。我认为Equals()或GetHashCode()的实现不正确。

代码丰满

当前,您Distinct()FamilySelector实例集合上运行其结果是通过引用相等性进行比较。

要正确执行此操作,您应传递一个实例IEqualityComparerDistinct()调用:

var source = _mfgOrdersData
    .Select(o => new FamilySelector(o.ItemWrapper.ItemClass, o.ItemWrapper.Family))
    .Distinct(new FamilySelector())
    .OrderBy(f => f.CodeFamily)
    .ToList();

您应该在FamilySelector类中添加无参数构造函数,以便可以编译代码。

我还建议对FamilySelector类进行少量重构当前,它保存数据并执行比较。通常,IEqualityComparer的实现是一个无数据类,仅执行比较:

class FamilyData
{
    public FamilyData(string code, string family)
    {
        Code = code;
        Family = family;
    }

    public string Code { get; set; }
    public string Family { get; set; }
    public string CodeFamily { get { return string.Format("{0}\t{1}", Code, Family); } }
}

class FamilySelector : IEqualityComparer<FamilyData>
{
    public bool Equals(FamilyData x, FamilyData y)
    {
        return x.Code == y.Code && x.Family == y.Family;
    }

    public int GetHashCode(FamilyData obj)
    {
        return obj.Code.GetHashCode() ^ obj.Family.GetHashCode();
    }
}

var source = _mfgOrdersData
    .Select(o => new FamilyData(o.ItemWrapper.ItemClass, o.ItemWrapper.Family))
    .Distinct(new FamilySelector())
    .OrderBy(f => f.CodeFamily)
    .ToList();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用LINQ基于另一个属性的两个不同列表中存在的数字之间的差异

使用linq在一个属性C#上过滤两个列表

使用C#中的一个ForEach语句迭代两个列表或数组

c# - 如何将两个不同的表列表放入一个新列表中

基于共同属性的两个(或多个)列表中的C#合并属性

IEqualityComparer 使用两个属性失败

使用IEqualityComparer比较两个列表

如何根据C#中的条件合并两个具有不同属性的列表

通过在列表推导中组合两个列表来创建一个列表

基于同一列表的两个不同属性的分层列表

合并两个列表,但选择一个具有较高属性值的列表c#

如何使用C#连接两个表,其中一个表包含MongoDB中另一个表的ID列表

使用LINQ仅基于单个对象属性来获取两个对象列表之间的差异

使用两个列表比较元素并在这两个列表中创建一个不同元素的列表?

C#采用两个不同对象的列表来构造新的对象列表

将两个不同对象的列表合并为一个。C# Unity2D

使用Java 8 Streams如何使用一个列表获取两个不同的列表

基于java 8中的匹配属性比较两个不同对象类型的列表

DataTable中的重复项,通过指定两个属性来获取最后一个

比较两个列表并根据 Linq C# 中的 Id 从第一个列表返回数据

jQuery IF语句基于两个下拉列表和一个文本框字段来计算费用

使用c ++中的两个略有不同的头文件(尽管是一个.lib文件)会导致很多错误,但未生成警告。怎么预防呢?

比较两个对象列表并通过比较java 8中两个列表的一个属性形成一个新列表

基于两个属性从列表中检索多个对象

C# - 将两个列表连接成一个配对值列表

如何自动生成一个或两个词来代表一个话题?

ComboBox绑定具有MVVM C#中两个不同类的两个不同属性

将一个json属性映射到Java中的两个不同字段(jackson)

在一个查询中按不同属性对两个模型进行排序