C# 在将自定义对象添加到列表之前,是否避免在列表中添加重复对象?
我在网上写了几篇文章,但对我来说都很有价值,我不明白如何才能避免在列表中添加重复的对象,我尝试了类似的方法 实际上,我创建了一个覆盖GetHashCode和Equal方法的类 现在我想形成一个非重复对象列表的集合C# 在将自定义对象添加到列表之前,是否避免在列表中添加重复对象?,c#,C#,我在网上写了几篇文章,但对我来说都很有价值,我不明白如何才能避免在列表中添加重复的对象,我尝试了类似的方法 实际上,我创建了一个覆盖GetHashCode和Equal方法的类 现在我想形成一个非重复对象列表的集合 public class FlightInfo { public string Origin { get; set; } public string DepartureTime { get; set; } public str
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,类就变成了列表,如果我有两个隐藏的列表对象,那么如何迭代这两个对象呢?它们在类对象上都可用吗?