C# 在将自定义对象添加到列表之前,是否避免在列表中添加重复对象?

C# 在将自定义对象添加到列表之前,是否避免在列表中添加重复对象?,c#,C#,我在网上写了几篇文章,但对我来说都很有价值,我不明白如何才能避免在列表中添加重复的对象,我尝试了类似的方法 实际上,我创建了一个覆盖GetHashCode和Equal方法的类 现在我想形成一个非重复对象列表的集合 public class FlightInfo { public string Origin { get; set; } public string DepartureTime { get; set; } public str

我在网上写了几篇文章,但对我来说都很有价值,我不明白如何才能避免在列表中添加重复的对象,我尝试了类似的方法

实际上,我创建了一个覆盖GetHashCode和Equal方法的类

现在我想形成一个非重复对象列表的集合

public class FlightInfo
    {
        public string Origin { get; set; }

        public string DepartureTime { get; set; }

        public string Destination { get; set; }

        public string DestinationTime { get; set; }

        public string Price { get; set; }

        public override bool Equals(object obj)
        {
            var other = obj as FlightInfo;

            if (other == null)
                return false;

            if (Origin != other.Origin || DepartureTime != other.DepartureTime || Destination != other.Destination
                || DestinationTime != other.DestinationTime || Price != other.Price)
                return false;

            return true;
        }

        public override int GetHashCode()
        {
            int hashOrigin = Origin.GetHashCode();
            int hashDestination = Destination.GetHashCode();

            int hashDepartureTime = DepartureTime.GetHashCode();

            int hashDestinationTime = DestinationTime.GetHashCode();

            int hashPrice = Price.GetHashCode();

            return hashOrigin ^ hashDestination ^ hashDepartureTime ^ hashDestinationTime ^ hashPrice;
        }
    }
我还试过Eric的一篇文章

https://blogs.msdn.microsoft.com/ericlippert/2011/02/28/guidelines-and-rules-for-gethashcode/
但这篇文章有

private List<T>[] buckets = new List<T>[100];
private List[]bucket=新列表[100];
插入私有
List()存储桶=新列表()


但是我想返回一个没有固定大小的列表。

因为您已经实现了
Equals
GetHashCode
方法,您可以拥有自己的
FlightInfo
自定义列表,该列表将使用这些方法:

public class FlightInfoList : IList<FlightInfo>
{
    private readonly List<FlightInfo> _flightInfos = new List<FlightInfo>();

    public IEnumerator<FlightInfo> GetEnumerator()
    {
        return _flightInfos.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return GetEnumerator();
    }

    public void Add(FlightInfo item)
    {
        if (_flightInfos.Any(flightInfo => flightInfo.Equals(item)))
        {
            throw new Exception("Cannot add duplicated values!");
        }

        _flightInfos.Add(item);
    }

    public void Clear()
    {
        _flightInfos.Clear();
    }

    public bool Contains(FlightInfo item)
    {
        return _flightInfos.Contains(item);
    }

    public void CopyTo(FlightInfo[] array, int arrayIndex)
    {
        _flightInfos.CopyTo(array, arrayIndex);
    }

    public bool Remove(FlightInfo item)
    {
        return _flightInfos.Remove(item);
    }

    public int Count => _flightInfos.Count;

    public bool IsReadOnly => false;

    public int IndexOf(FlightInfo item)
    {
        return _flightInfos.IndexOf(item);
    }

    public void Insert(int index, FlightInfo item)
    {
        _flightInfos.Insert(index, item);
    }

    public void RemoveAt(int index)
    {
        _flightInfos.RemoveAt(index);
    }

    public FlightInfo this[int index]
    {
        get => _flightInfos[index];
        set => _flightInfos[index] = value;
    }
}
公共类FlightInfoList:IList
{
私有只读列表_flightInfos=新列表();
公共IEnumerator GetEnumerator()
{
返回_flightInfos.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
返回GetEnumerator();
}
公共作废添加(FlightInfo项)
{
如果(_flightInfos.Any(flightInfo=>flightInfo.Equals(item)))
{
抛出新异常(“无法添加重复的值!”);
}
_flightInfos.Add(项目);
}
公共空间清除()
{
_flightInfos.Clear();
}
公共bool包含(FlightInfo项)
{
返回_flightInfos.Contains(项目);
}
public void CopyTo(FlightInfo[]数组,int arrayIndex)
{
_CopyTo(数组,数组索引);
}
公共布尔删除(FlightInfo项)
{
返回_flightInfos.Remove(项目);
}
public int Count=>\u flightInfos.Count;
公共bool IsReadOnly=>false;
public int IndexOf(FlightInfo项)
{
返回_flightInfos.IndexOf(项目);
}
公共无效插入(整数索引,FlightInfo项)
{
_flightInfos.Insert(索引,项目);
}
公共无效删除(整数索引)
{
_flightInfos.RemoveAt(索引);
}
public FlightInfo此[int index]
{
获取=>_flightInfos[索引];
set=>\u flightInfos[index]=值;
}
}

请注意,在
Add
方法中,我正在检查是否存在重复的。解决这个问题的另一种方法是使用字典。

我应该如何将这个对象暴露给外部世界,将其公开是好的吗?不需要!您可以像
var flightInfoes=new FlightInfoList()那样简单地实例化它并像这样使用:
flightInfoes.Add(new FlightInfo())。请注意,
FlightInfoList
实现了接口
IList
,使其像列表一样工作。
FlightInfo
的实际列表隐藏在对象本身内部,其目的是迫使外部使用我们的自定义
Add
方法来检查重复项。@javier capelloan:你能给我一些见解吗,这是如何变成列表的,只要实现Ilist,类就变成了列表,如果我有两个隐藏的列表对象,那么如何迭代这两个对象呢?它们在类对象上都可用吗?