[] [] int型から重複を削除する方法
-
22-08-2019 - |
質問
Iは、配列の配列を持っている - 各要素が選択開始位置と終了手段VSTOを使用してExcelでの選択に関する情報
。たとえば、
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または拡張メソッドを使用して、方法を見つけるために私を助けていただけますか?私は意味:F
とF
、H:I
とH:I
を、など。
解決
あなたは純粋な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();
希望に役立ちます。
他のヒント
まず、整数配列を比較する方法が必要です。フレームワークのクラスでそれを使用するには、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つの整数の配列が含まれています。
所属していません StackOverflow