简介
我是一名比利时软件工程师,在一家生产折弯机的公司工作。我现在有一个有趣的问题,我想知道最好的解决方案,性能在我的工作环境中非常重要。我认为其他程序员也可能会感兴趣。
数据
我有一个列表,其中包含一组类类型为“CS3DLine”的对象。
List <CS3DLine> ListParallelLines = new List<CS3DLine>();
我还有一个自定义方法,它将其中两个对象作为参数并返回一个 bool 值,指示这两个对象是否相等。
public static bool IsSameLineIn3D(CS3DLine povleft, CS3DLine povright)
通缉
我想得到一个 FilteredListParallelLines,其中相等的 CS3DLines 完全从列表中过滤掉。
备注
- 在 Internet 上,我找到了使用 Distinct 方法和 IEqualityComparer 的示例(例如在 dotNetPerls 上的此页面上),但在这些情况下,只有重复项被删除,而不是具有重复项的原件。
- 我知道我也可以尝试迭代解决这个问题,但我担心如果列表包含大量对象,这会导致性能不佳。
最佳答案
如果我没理解错的话,以下是一种基于集合的方法,可能会满足您的要求。我不能保证性能。
如果列表的顺序不重要,可以简化。
在没有定义 CS3DLine
的情况下,我为自己的 Line 类提供了一个示例。
与以往一样,在使用基于集合的方法时,线类最好是不可变的。
void Main()
{
List<Line> lines = new List<Line>();
var comparer = LineEqualityComparer.Instance;
var filtered = lines
.Select((line, idx) => new { line, idx })
.GroupBy(x => x.line, comparer)
.Where(g => g.Count() == 1)
.SelectMany(g => g)
.OrderBy(x => x.idx)
.Select(x => x.line);
}
class Line
{
public int X1 { get; }
public int Y1 { get; }
public int X2 { get; }
public int Y2 { get; }
}
class LineEqualityComparer : IEqualityComparer<Line>
{
public static IEqualityComparer<Line> Instance { get; } = new LineEqualityComparer();
public bool Equals(Line x, Line y)
{
//fill-in the blanks
}
public int GetHashCode(Line obj)
{
//fill-in the blanks
}
}
在大型数据集上,您可能可以通过策略性地放置 .AsParallel()
某处 来获得更好的查询性能linq 方法链。
关于c# - 从 C# 中的列表中完全删除所有至少有一个重复项的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52060735/