c# - 从 C# 中的列表中完全删除所有至少有一个重复项的元素

标签 c# list filter

简介

我是一名比利时软件工程师,在一家生产折弯机的公司工作。我现在有一个有趣的问题,我想知道最好的解决方案,性能在我的工作环境中非常重要。我认为其他程序员也可能会感兴趣。

数据

  • 我有一个列表,其中包含一组类类型为“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/

相关文章:

css - 如何在 CSS 中的图像中添加渐变/滤镜

c# - Asp.net MVC - 在 cshtml 页面中创建环境特定的元标记

c# - 为什么在尝试与 SQL Server 建立连接时出现此错误?

c# - 在 .net 核心中使用多个结果集

python - "TypeError: ' 在函数签名中输入 ' object is not subscriptable"

list - flutter 将项目添加到列表

haskell - 您将如何在 Haskell 中使用 foldr 定义映射和过滤器?

c# - Azure 通知中心 templateName 的使用

list - (Scala) 可以包含列表作为元素的列表

c# - 使用 FIFO 进行过滤