2009-03-31 30 views
1

配列の配列 - VSTOを使用してExcelで選択に関する情報を表示します。各要素は開始位置と終了位置を意味します。例えばint [] []から重複を削除する方法

int[][] selection = { 
new int[] { 1 }, // column A 
new int[] { 6 }, // column F 
new int[] { 6 }, // column F 
new int[] { 8, 9 } // columns H:I 
new int[] { 8, 9 } // columns H:I 
new int[] { 12, 15 } // columns L:O 
}; 

あなたは多分重複要素を削除するには、LINQまたは拡張メソッドを使用して、方法を見つけるために私を助けていただけますか?私は意味:FFH:IH:Iなど

+1

最も良い方法を定義する:a)最速、b)読みやすいコード、c)最小量のメモリを使用するなど –

+0

重複する行?行が同じかどうかを正確に判断するもの - 正確に同じシーケンスでなければならないのでしょうか? –

+0

訂正していただきありがとうございます。投稿を編集しました – abatishchev

答えて

3

をあなたは純粋なLINQ /拡張メソッドソリューションを使用する場合は、配列/配列についてはIEqualityComparerの独自の実装を定義する必要があります。 (明らかに何かが分からない限り、BCLには既存の配列やシーケンス比較機能はありません)。しかし、これはそれほど難しいことではありません - ここではかなりよく仕事をするべきものの例です:

public class SequenceEqualityComparer<T> : IEqualityComparer<IEnumerable<T>> 
{ 
    public bool Equals(IEnumerable<T> x, IEnumerable<T> y) 
    { 
     return Enumerable.SequenceEqual(x, y); 
    } 

    // Probably not the best hash function for an ordered list, but it should do the job in most cases. 
    public int GetHashCode(IEnumerable<T> obj) 
    { 
     int hash = 0; 
     int i = 0; 
     foreach (var element in obj) 
      hash = unchecked((hash * 37 + hash) + (element.GetHashCode() << (i++ % 16))); 
     return hash; 
    } 
} 

この方法の利点は、あなたが、単に重複配列を削除するには、次を呼び出すことができるということです。

var result = selection.Distinct(new SequenceEqualityComparer<int>()).ToArray(); 

希望します。

0

まず、整数配列を比較する方法が必要です。フレームワークのクラスで使用するには、EquailtyComparerを作成します。配列は常にソートされている場合、それは実装が比較的容易である:

public class IntArrayComparer : IEqualityComparer<int[]> { 

    public bool Equals(int[] x, int[] y) { 
     if (x.Length != y.Length) return false; 
     for (int i = 0; i < x.Length; i++) { 
      if (x[i] != y[i]) return false; 
     } 
     return true; 
    } 

    public int GetHashCode(int[] obj) { 
     int code = 0; 
     foreach (int value in obj) code ^= value; 
     return code; 
    } 

} 

今、あなたはユニークな配列を得るためにHashSetの中でキーとして整数配列を使用することができます。

int[][] selection = { 
    new int[] { 1 }, // column A 
    new int[] { 6 }, // column F 
    new int[] { 6 }, // column F 
    new int[] { 8, 9 }, // columns H:I 
    new int[] { 8, 9 }, // columns H:I 
    new int[] { 12, 15 } // columns L:O 
}; 

HashSet<int[]> arrays = new HashSet<int[]>(new IntArrayComparer()); 
foreach (int[] array in selection) { 
    arrays.Add(array); 
} 

HashSetのはただ投げます重複した値があるので、4つの整数配列が含まれるようになりました。

関連する問題