2016-05-28 18 views
0

我有一个Point类的列表。使用LINQ从列表中选择频率为1的项目<T>使用LINQ

两个点在列表中只重复一次,其余两次重复。

如何查找使用LINQ重复的点?

+0

的一种方法是通过分组结果,然后各组计数的记录数。只需重复一次,就可以添加一个where子句,只返回计数为2的记录。 –

回答

0
using System; 
using System.Collections.Generic; 
using System.Linq; 

class Point 
{ 
    int x, y; 
    public Point(int x, int y) 
    { 
     this.x = x; 
     this.y = y; 
    } 
    public int X 
    { 
     get { return x; } 
     set { x = value; } 
    } 
    public int Y 
    { 
     get { return y; } 
     set { y = value; } 
    } 
} 
class Test 
{ 
    static void Main() 
    { 
     var collection = new List<Point> 
     { 
      new Point(1,1), 
      new Point(1,2), 
      new Point(1,1), 
      new Point(1,2), 
      new Point(3,3), 
      new Point(4,5), 
     }; 
     var result = collection.Where(a => collection.Count(b => b.X == a.X && b.Y == a.Y) == 1); 
     foreach (var val in result) 
      Console.WriteLine(val.X + "," + val.Y); 
    } 
} 
//output: 
3,3 
4,5 
+0

谢谢。你的解决方案实际上为我工作。 – Vahid

0

试试这个:

var result = points.Where(p1 => points.Count(p2 => p1.Contains(p2)) == 1); 
+0

这不起作用。 – Vahid

1

该解决方案将一批相同点就是,让你找到组,只有一个成员,并返回该成员。

我还没有检查过实际的运行时间,但很有可能它比在一个Where内部运行Count()操作的解决方案更好,性能明智,因为那可能运行在O(n^2)时间,而GroupBy实现可能更优雅。要做到这一点

var result = points 
.GroupBy(p => p) 
.Where(group => group.Count() == 1) 
.Select(group => group.First()); 
+0

谢谢。不幸的是,“Groupby”没有将两个相似的点分组。我有4分的名单。这些点就像{p1,p2,p2,p3}。结果仍然是4分! – Vahid

+1

这意味着Point类型不能正确实现相等性。这是一个自定义类型还是内置的'Point'结构?结构默认实现结构相等(如果'p1.X == p2.Y && p1.Y == p2.Y',两个'Point's是相等的),但是如果它是一个自定义类型,那么您必须确保他们实现IEquatable或传入一个IEqualityComparer。 –

+0

谢谢Anver。是的,这是一种自定义类型。 – Vahid