仅当两个字符串都是重复字符串时,才从类中删除重复项

本文关键字:字符串 删除 两个 | 更新日期: 2023-09-27 18:33:54

我有一个包含 2 个字符串的 C# 类,orderNumber 和 trackingNumber。 我创建了一个此类的列表并将数据放入其中。 我需要删除订单号和跟踪号都是重复的任何重复项。 有时该类可能包含重复的订单号,但跟踪号不同,因此我需要同时保留两者。

谢谢Andrew

仅当两个字符串都是重复字符串时,才从类中删除重复项

您可以连接这些字符串,然后根据串联的字符串进行选择。

List<Item> list = new List<Item>();
Item[] result = list.GroupBy(x => new {x.trackingNumber, x.orderNumber}).Select(x => x.First()).ToArray();

如果您不处理数十亿个条目,这应该可以很好地工作。

我认为你可以这样做。我假设实体类包含订单号和跟踪号属性。您可以将其替换为原始类名。

public class EntityList : List<Entity>
{
    public void Add(Entity entity)
    {
        if (this.Any(n => n.OrderNumber == entity.OrderNumber && n.TrackingNumber == entity.TrackingNumber))
            return;
        base.Add(entity);
    }
}

和用法:

        var entity1 = new Entity
        {
            OrderNumber = "1",
            TrackingNumber = "100"
        };
        var entity2 = new Entity
        {
            OrderNumber = "2",
            TrackingNumber = "101"
        };
        var entity3 = new Entity
        {
            OrderNumber = "1",
            TrackingNumber = "100"
        };

        var list = new EntityList();
        list.Add(entity1);
        list.Add(entity1);
        list.Add(entity3);
        Console.WriteLine("Count : " + list.Count);
例如,

假设这是您的类:

private class Foo
{
    public readonly string trackingNumber;
    public readonly string orderNumber;
    public Foo(string trackingNumber, string orderNumber)
    {
        this.trackingNumber = trackingNumber;
        this.orderNumber = orderNumber;
    }
}

通过trackingNumberorderNumber获取唯一项可以通过利用 Distinct 方法传递适当的比较器来实现:

    private class ByTrackingNumberAndOrderComparer : IEqualityComparer<Foo>
    {
        public bool Equals(Foo x, Foo y)
        {
            return string.Equals(x.trackingNumber, y.trackingNumber)
                && string.Equals(x.orderNumber, y.orderNumber);
        }
        public int GetHashCode(Foo obj)
        {
            return (obj.trackingNumber == null ? 0 : obj.trackingNumber.GetHashCode())
                ^ 397 ^ (obj.orderNumber == null ? 0 : obj.orderNumber.GetHashCode());
        }
    }

用法:

Foo[] foos = Generate(150000);
Foo[] distinct = foos.Distinct(new ByTrackingNumberAndOrderComparer()).ToArray();