2016-06-30 10 views
4

の別個のペアを見つける:Iは、アレイの別個の要素を返すためにこの機能を有する二次元アレイ

public static object[] Distinct(object[] array) 
{ 
    return array.Select(x => x.ToString()).Distinct().ToArray(); 
} 

Iは、2列の行列にこれを拡張すると、それは別個のペアを返すべきたい。

public static object[,] Distinct(object[,] array) 
{ 
    return array.Select((x,y) => x.ToString(), y.ToString()).Distinct().ToArray(); 
} 

をしかし、私はそれは私が何をしようとしているうまく示し思う:

これは明らかに動作しません。どのポインタも素晴らしいでしょう。

+1

はなぜ '文字列[]'と '文字列[、]'の代わりに 'オブジェクト[]'と 'オブジェクト[、]'を返しませんか?それは渡された元のオブジェクトを返さないことを明確にします。 – juharr

答えて

3

2次元配列をTupleのシーケンスに変換してからDistinctを実行します。次に、2D配列に変換し直します。

public static object[,] Distinct(object[,] array) 
{ 
    var distinct = Enumerable.Range(0, array.GetLength(0)) 
     .Select(i => Tuple.Create(array[i, 0].ToString(), array[i, 1].ToString())) 
     .Distinct() 
     .ToList(); 
    var newArray = new object[distinct.Count, 2]; 
    for (int i = 0; i < distinct.Count; i++) 
    { 
     newArray[i, 0] = distinct[i].Item1; 
     newArray[i, 1] = distinct[i].Item2; 
    } 

    return newArray; 
} 

これはアレイの第二の次元の長さは> = 2であり、そしてそれが大きい場合、それはちょうど最初の2つの位置から値を返すだと仮定していることに留意されたいです。

1

最終的には、ジェネリックで拡張メソッドとして使用しますか?

public static T[,] Distinct<T>(this T[,] array) 
{ 
    var result = Enumerable.Range(0, array.GetLength(0)) 
     .Select(i => new { x = array[i, 0], y = array[i, 1] }) 
     .Distinct(); 

    T[,] ret = new T[result.Count(), 2]; 
    for (int i = 0; i < result.Count(); i++) 
    { 
     ret[i, 0] = result.ElementAt(i).x; 
     ret[i, 1] = result.ElementAt(i).y; 
    } 

    return ret; 
} 

だから、これは可能でしょう:

int[,] test = new int[,] { { 1, 2 }, { 1, 3 }, { 2, 4 }, { 1, 3 } }; 
var result = test.Distinct(); 
+0

結果に 'ToList'を使う方が良いので、' Count'への呼び出しのシーケンスを反復する必要がなく、 'ElementAt '。 – juharr

+1

'IEqualityComparer 'で渡されるバージョンを考慮して、配列内の項目を比較する方法を制御したいときに 'Distinct'に渡すこともできます。 – juharr

+0

@juharr非常に良いアイデア –

関連する問題