2016-09-06 10 views
3

リストはxとyの場所に基づいて複数の場所で構成されており、2つの場所の違いをとっています。例えば、私は(0,1)、(1,0)と(1,2)、(2,1)と(2,3)、(3,2)のような重複を持っています。私は私の目標を達成するために私のリストからそれらのすべての重複を削除したい。これを行う簡単な方法はありますか?私はアルゴリズムを構築しようとしていますが、かなり難しいです。私は、90箇所のように持っているとC#のリストで重複を削除する方法

+0

1つ以外のすべてを削除しますか? –

+0

いいえ、私は違いを取っており、同じ結果を与えるので、反対の場所を削除したいと思います。したがって、私が(0,1)と(1,0)を持っているなら、私は(1,0)を取り除きたいです。 @TimSchmelter –

+1

(1,0)と(0,1)はどのように重複していますか? –

答えて

2

自身を複製したときに、私は、ロジック用のカスタムcomparererでEnumerable.Distinctを使用するかを決定することは容易ではないので:

public class OppositeLocationsEqualComparer : IEqualityComparer<Location> 
{ 
    public bool Equals(Location l1, Location l2) 
    { 
     if (object.ReferenceEquals(l1, l2)) return true; 
     if (l1 == null || l2 == null) return false; 
     return (l1.X == l2.X && l1.Y == l2.Y) || (l1.X == l2.Y && l1.Y == l2.X); 
    } 

    public int GetHashCode(Location l) 
    { 
     if(l == null) return int.MinValue; 
     return Math.Abs(l.X - l.Y); 
    } 
} 

今、あなたはEnumerable.Distinct(および他の多くを使用することができますこの比較演算子とLINQのメソッド):

List<Location> uniqueLocations = locationList 
    .Distinct(new OppositeLocationsEqualComparer()) 
    .ToList(); 
7

最も簡単な解決策は、あなたのXとの順番を気にしないあなたのポイントクラスのIEqualityComparerを作成することですでは、Distinctを使用して重複を取り除くことができます。

public class MyPoint 
{ 
    public int X { get; set; } 
    public int Y { get; set; } 
} 

public class PointComparer : IEqualityComparer<MyPoint> 
{ 
    public bool Equals(MyPoint x, MyPoint y) 
    { 
     if (ReferenceEquals(x, y)) return true; 
     if (ReferenceEquals(x, null)) return false; 
     if (ReferenceEquals(y, null)) return false; 
     return (x.X == y.X && x.Y == y.Y) || 
       (x.X == y.Y && x.Y == y.X); 
    } 

    public int GetHashCode(MyPoint obj) 
    { 
     return (obj?.X.GetHashCode() ?? 0)^(obj?.Y.GetHashCode() ?? 0); 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     List<MyPoint> data = GetDataFromSomewhere(); 

     var singularData = data.Distinct(new PointComparer()).ToList(); 
    } 
} 
関連する問題