重複するエントリを持つ配列を圧縮する関数を作成するにはどうすればよいですか?
例えば!
ソートされた整数の配列を受け取り、圧縮された配列を返す関数。つまり、1、2、6、8、8、8、9、10、10を含む配列が与えられた場合、関数が戻ると、配列の内容は1、2、6、8、9、10になります。 。
これはハードウェアではありません。これを行う関数を作ろうとしています。
重複するエントリを持つ配列を圧縮する関数を作成するにはどうすればよいですか?
例えば!
ソートされた整数の配列を受け取り、圧縮された配列を返す関数。つまり、1、2、6、8、8、8、9、10、10を含む配列が与えられた場合、関数が戻ると、配列の内容は1、2、6、8、9、10になります。 。
これはハードウェアではありません。これを行う関数を作ろうとしています。
どうですか:
array = array.Distinct().ToArray();
または、関数として:
private int[] RemoveDuplicates(int[] array)
{
return array.Distinct().ToArray();
}
次に、次のように呼び出します。
array = RemoveDuplicates(array);
拡張メソッド:
public static T[] RemoveDuplicates<T>(this T[] array)
{
return array.Distinct().ToArray();
}
public static List<T> RemoveDuplicates<T>(this List<T> list)
{
return list.Distinct().ToList();
}
配列に使用:
int[] array = new[] {1, 3, 4, 3};
array = array.RemoveDuplicates();
リストに使用:
List<int> list = new List<int> {1, 3, 4, 3};
list = list.RemoveDuplicates();
最も簡単な方法は、おそらくLinqを使用することです
array = array.Distinct().ToArray()
ただし、Linqが常に最速のアプローチであるとは限りません。
Linqを使用したくない場合は、次のようなことを行うことができます(テストされていませんが、近いです)
List<int> compacted = new List<int>();
// If array is not a local variable:
// Assign to a variable to avoid re-evaluating the property every loop iteration
// Otherwise use array.Length as the loop termination condition to enable array
// bounds check elimination. Thanks @Harold for the insight
// http://blogs.msdn.com/b/clrcodegeneration/archive/2009/08/13/array-bounds-check-elimination-in-the-clr.aspx
int max = array.Length;
int last = 0;
for (int i=0; i < max; i++)
{
if (i == 0)
{
compacted.Add(array[i]);
last = array[i];
}
else
{
if (array[i] != last) compacted.Add(array[i]);
last = array[i];
}
}
array = compacted.ToArray();