加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 从列表创建列表,删除重复项.

发布时间:2020-12-15 23:59:50 所属栏目:百科 来源:网络整理
导读:有一个非常相关的问题: Create ListCustomObject from Liststring然而它并不涉及同时删除重复项. 我有以下类示例: class Widget{ public string OwnerName; public int SomeValue;}class Owner{ public string Name; public string OtherData;} 我想根据小
有一个非常相关的问题: Create List<CustomObject> from List<string>然而它并不涉及同时删除重复项.

我有以下类示例:

class Widget
{
    public string OwnerName;
    public int SomeValue;
}

class Owner
{
    public string Name;
    public string OtherData;
}

我想根据小部件列表创建一个所有者列表,但只有唯一的所有者名称.

这是我尝试过的:

List<Owner> Owners = MyWidgetList.Select(w => new Owner { Name = w.OwnerName }).Distinct().ToList();

问题是结果列表中有重复.我究竟做错了什么?

解决方法

您需要为对象定义GetHashCode()和Equals(),以定义自定义类型的相等性.否则,它会根据引用本身进行比较.

这是因为LINQ扩展方法使用IEqualityComparer接口来比较对象.如果没有定义自定义比较器(可以通过创建实现IEqualityComparer< Owner>的单独类来实现),它将使用默认的相等比较器,它使用类的Equals()和GetHashCode()定义.其中,如果不覆盖它们,则引用Equals()上的比较并返回默认对象哈希码.

定义自定义IEqualityComparer< Owner> (因为你在一系列所有者上调用distinct)或者为你的类添加一个Equals()和GetHashCode().

public class Owner
{
    public string Name;
    public string OtherData;

    public override Equals(object other)
    {
        if (ReferenceEquals(this,other))
            return true;

        if (other == null)
            return false;

        // whatever your definition of equality is...
        return Name == other.Name && OtherData == other.OtherData;
    }

    public override int GetHashCode()
    {
        int hashCode = 0;

        unchecked
        {
           // whatever hash code computation you want,but for example...
            hashCode += 13 * Name != null ? Name.GetHashCode() : 0;
            hashCode += 13 * OtherData != null ? OtherData.GetHashCode() : 0;
        }

        return hashCode;
    }
}

一旦你这样做,你写的查询将正常工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读