C# 从IEnumerable中删除重复行

C# 从IEnumerable中删除重复行,c#,wpf,datagrid,C#,Wpf,Datagrid,我想知道如何从IEnumerable中删除重复行。我有以下代码: public IEnumerable <Shipments> Shipments { get { Debug.Print("Initiated"); foreach (var item in Loads) {

我想知道如何从IEnumerable中删除重复行。我有以下代码:

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))
                        {
                                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))中的var item2)
{
返回新装运({到达=item2.CarrierArrival,离开=item2.CarrierDeparture,颁发者=item.Customer,目的地=item.ShipTo,LoadType=item.LoadType};
}
}
}
}
}
这给了我这个数据,将其用作项目源


我的目标是,只有在不存在相同货物的情况下,才能退回新的货物。我该怎么做呢?

您可以创建一个实现
IEqualityComparer
的类:


您可以创建一个实现
IEqualityComparer
的类:


您的装运类型是否/能否实现
等于
GetHashCode
?什么是“同一装运”?Guruston示例2与1@SmackYouIn2.3它没有回答我的问题=)所有字段应该相等吗?或者还有其他一些逻辑:“不是所有的文件都有空格,但我仍然需要解析这些空格。”但是
if
使得只有带有空格的记录才能返回。我不理解您声明中的“以及”部分。您的装运类型是否可以实现
Equals
GetHashCode
?什么是“同一装运”?Guruston示例2与1@SmackYouIn2.3它没有回答我的问题=)所有字段应该相等吗?或者还有其他一些逻辑:“不是所有的文件都有空格,但我仍然需要解析这些空格。”但是
if
使得只有带有空格的记录才能返回。我不理解你的陈述中的“以及”部分。IEnumerable不包含区分的定义。它有?这就是我在实施你的建议后在foreach上得到的。@smackeyouin2.3我不知道类型是
路线
,而不是
装运
。我已经更新了我的答案,改为使用
路由
。很抱歉,我从来没有听说过gethashcode,除非它是GTA modding lol。这很有效。我接受了。谢谢你的帮助!IEnumerable不包含Differentit的定义?这就是我在实施你的建议后在foreach上得到的。@smackeyouin2.3我不知道类型是
路线
,而不是
装运
。我已经更新了我的答案,改为使用
路由
。很抱歉,我从来没有听说过gethashcode,除非它是GTA modding lol。这很有效。我接受了。谢谢你的帮助!
class RoutesComparer : IEqualityComparer<Routes>
{
    // Might want to add null checks here.
    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);
}
foreach (var item2 in Routes.Where(d => d.DockCode == item.ShipTo.Substring(0, item.ShipTo.IndexOf(" "))
    && d.CarrierDeparture.TimeOfDay == item.ShipTime.TimeOfDay).Distinct(new RoutesComparer()))