C# 使用distinct删除重复项
我有一节课C# 使用distinct删除重复项,c#,wpf,C#,Wpf,我有一节课 class ShipmentsComparer : IEqualityComparer<Routes> { public bool Equals(Routes route1, Routes route2) => route1.DockCode == route2.DockCode && route1.CarrierArrival == route2.CarrierArrival;
class ShipmentsComparer : IEqualityComparer<Routes>
{
public bool Equals(Routes route1, Routes route2) =>
route1.DockCode == route2.DockCode
&& route1.CarrierArrival == route2.CarrierArrival;
public int GetHashCode(Routes obj) =>
obj.DockCode.GetHashCode() ^ (obj.CarrierArrival.GetHashCode() * 13);
}
class Shipments比较者:IEqualityComparer
{
公共布尔等于(路由路由1、路由2)=>
route1.DockCode==route2.DockCode
&&route1.CarrierArrival==route2.CarrierArrival;
public int GetHashCode(路由对象)=>
obj.DockCode.GetHashCode()^(obj.CarrierArrival.GetHashCode()*13);
}
还有一个数不清的
public IEnumerable <Shipments> Shipments
{
get
{
Debug.Print("Initiated");
foreach (var item in Loads)
{
if (item.ShipTo.Contains(" "))
{
foreach (var item2 in Routes.Where(d => d.DockCode == item.ShipTo.Substring(0, item.ShipTo.IndexOf(" ")) && d.CarrierDeparture.TimeOfDay == item.ShipTime.TimeOfDay).Distinct(new ShipmentsComparer()))
{
yield return new Shipments() { Arrival = item2.CarrierArrival, Departure = item2.CarrierDeparture, Issuer = item.Customer, Destination = item.ShipTo, LoadType = item.LoadType };
}
}
}
}
}
公共IEnumerable装运
{
得到
{
调试。打印(“启动”);
foreach(负载中的var项目)
{
如果(项目.ShipTo.Contains(“”))
{
foreach(Routes.Where(d=>d.DockCode==item.ShipTo.Substring(0,item.ShipTo.IndexOf(“”))和&d.CarrierDeparture.TimeOfDay==item.ShipTime.TimeOfDay)中的变量item2)。Distinct(新的ShipmentsComparer())
{
返回新装运({到达=item2.CarrierArrival,离开=item2.CarrierDeparture,颁发者=item.Customer,目的地=item.ShipTo,LoadType=item.LoadType};
}
}
}
}
}
要删除重复的值,但我仍然在我的项目源中获得重复项,如下所示:
我怎样才能让它只显示每个载波到达时间中的一个呢?看起来您得到的是重复的,因为您只“区分”了内环结果。您需要在调用端使用
Distinct
-Shipmetns.Distinct(new ShipmentsComparer())
,或者如果要在属性中过滤它们,可以使用HashSet
:
class ActuallyShipmentsComparer : IEqualityComparer<Shipments>
{
//your logic
}
public IEnumerable <Shipments> Shipments
{
get
{
Debug.Print("Initiated");
var hash = new HashSet<Shipments>(new ActuallyShipmentsComparer());
foreach (var item in Loads)
{
if (item.ShipTo.Contains(" "))
{
foreach (var item2 in Routes.Where(d => d.DockCode == item.ShipTo.Substring(0, item.ShipTo.IndexOf(" ")) && d.CarrierDeparture.TimeOfDay == item.ShipTime.TimeOfDay).Distinct(new ShipmentsComparer()))
{
var shipments = new Shipments { Arrival = item2.CarrierArrival, Departure = item2.CarrierDeparture, Issuer = item.Customer, Destination = item.ShipTo, LoadType = item.LoadType };
if(hash.Add(shipments))
{
yield return shipments;
}
}
}
}
}
}
请显示
ShipmentsComparer
的实现CarrierArrival
(如果是DateTime
)的值可能不同(最多几秒钟)。你能证明真的有复制品吗?第二条红线是什么的重复?我想这只是因为你多次重复加载,这意味着你多次迭代路由,这意味着即使你从一个没有重复项的集合中采样,也可以多次添加项。@mm8我只是尝试了一下,但仍然得到了重复的行我以前从未使用过哈希集,我在使用你的底层代码时遇到了这个问题:它要我做的修复是散列。添加(路由)(装运))
,这也不起作用。@smackeyouin2.3对不起,我的错,把它改成散列。添加(项目2)
(在我的第二个代码片段中修复)。@smackeyouin2.3很乐意帮忙!
public IEnumerable<Shipments> Shipments
{
get
{
Debug.Print("Initiated");
var hash = new HashSet<Routes>(new ShipmentsComparer()); // rename ShipmentsComparer cause it is actually RoutesComparer
foreach (var item in Loads)
{
if (item.ShipTo.Contains(" "))
{
foreach (var item2 in Routes.Where(d => d.DockCode == item.ShipTo.Substring(0, item.ShipTo.IndexOf(" ")) && d.CarrierDeparture.TimeOfDay == item.ShipTime.TimeOfDay))
{
if(hash.Add(item2))
{
yield return new Shipments { Arrival = item2.CarrierArrival, Departure = item2.CarrierDeparture, Issuer = item.Customer, Destination = item.ShipTo, LoadType = item.LoadType };
}
}
}
}
}
}