2017-02-14 7 views
0
私はこの例のように、アレイモデルを持つ配列を比較し、構造を完了する必要があり

完全:比較し、二つの配列

array = [0,1,2,3,4] 
model = [0,0,0,0,0,0,0] 

result = [0,1,2,3,4,0,0] 

モデルを変更することはできません、それは参照配列です。

これを達成するための最善の方法についてのご意見はありますか?

+2

を行うことができない場合は、比較のための地面は何ですか?大きい、小さい、等しい? –

+0

@MongZhu私が理解しているものは、ゼロとは異なります。 – NicoRiff

+0

が最高です。最速?少ないコードが可能ですか? ... –

答えて

3

コピー長いものに短い1:

int[] array = { 0, 1, 2, 3, 4 }; 
int[] model = { 0, 0, 0, 0, 0, 0, 0, }; 


int[] result = model; 

array.CopyTo(result, 0); 

Console.WriteLine(String.Join(" ", result)); 

あなたがここにあなたのコメントに書いたように最高の最速の意味場合の比較です:

Stopwatch st = new Stopwatch(); 

int[] array = new int[10000]; 
int[] model = new int[10200]; 

st.Start(); 
var asdf = array.Concat(model.Skip(array.Length)).ToArray(); 
st.Stop(); 
Console.WriteLine("Concat: " + st.ElapsedMilliseconds); 


int[] arraya = new int[10000]; 
int[] modela = new int[10200]; 

st.Restart(); 
int[] result = modela; 
arraya.CopyTo(result, 0); 
st.Stop(); 
Console.WriteLine("Copy: " + st.ElapsedMilliseconds); 
4

あなたはそのようなことを行うことができます。

var array = new[]{0,1,2,3,4}; 
var model = new[]{0,0,0,0,0,0,0}; 

var result = array.Concat(model.Skip(array.Length)).ToArray(); 

これはarrayの終わりにmodelから欠落している要素をCONCATます。


ConcatSkipToArrayは、名前空間System.LinqEnumerableクラスで宣言LINQの拡張メソッドです。したがって、コードにusing System.Linq;を追加する必要があります。

+0

「System.Arrayに 'Concat'の定義がありません」というメッセージが表示されますが、参照は忘れていますか? – user3571412

+0

@ user3571412はい、LINQ拡張です。 'using System.Linq;'を追加します。私の答えを更新しました。 –

+0

これは最速ではありません。 –

2

あなたが先行配列の長さを知っている場合あなたはこれを行うことができます...

int[] array = { 0, 1, 2, 3, 4 }; 
int[] model = { 0, 0, 0, 0, 0, 0, 0, }; 

Array.Copy(array, model, array.Length); 

もしそうでない場合は、このようなことができます...

int[] model = { 0, 1, 2, 3, 4 }; 
var array = new int[7]; 

var shorter = array.Length < model.Length ? array : model; 
var longer = array.Length >= model.Length ? array : model; 
Array.Copy(shorter, longer, shorter.Length); 
...最速の原稿の突然変異のない...

int[] array = { 0, 1, 2, 3, 4 }; 
int[] model = { 4,5,6,7,8,9,1, }; 

var x = array.Length < model.Length ? 
    new { s = array, l = model, sl = array.Length, ll = model.Length } : 
    new { s = model, l = array, sl = model.Length, ll = array.Length }; 

var result = new int[x.ll]; 

Array.Copy(x.s, result, x.sl); 
Array.Copy(x.l, x.sl, result, x.sl, x.ll - x.sl); 
+0

私はOPが彼の 'モデル 'が手術中に変更されることを望んでいないと思います。 –

+0

もっと大きな配列にコピーするだけなら、これは私がやることです。 –

+1

は、新しい配列を宣言し、両方でコピーします。 'Array.Copy'は、アンロールされたループ以外の最も速いオプションです。 –

-1

は、ここに私のバージョンです...少し速くLINQよりもございます。私の前提は、配列数が多い配列に基づいて置き換えていますが、間違っている可能性があります。

var array = new[]{0,1,2,3,4}; 
var model = new[]{0,0,0,0,0,0,0}; 
for(int i = 0; i < array.Length; i++) 
{  
    if(array[i] > model[i]) 
    { 
     model[i] = array[i]; 
    } 
} 

あなたは、単にArray.Copy

+0

最も早い場合は、ループの前に 'array.Length'チェックを移動する必要があります。 –

+0

ええと、私は実際にユーザーが既に配列構造を知っていると仮定しています。 –

+0

はい、これは各パスで 'array.Length'を呼び出します。 'var len = array.Length;を実行します。 for(var i = 0; i