仅当两个字符串都是重复字符串时,才从类中删除重复项
本文关键字:字符串 删除 两个 | 更新日期: 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;
}
}
通过trackingNumber
和orderNumber
获取唯一项可以通过利用 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();