Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用distinct删除重复项_C#_Wpf - Fatal编程技术网

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 };
                        }                             
                    }
                }
            }
        }
    }