2016-03-28 29 views
0

Dizideki yineleme miktarını en iyileştirme görevim var.Optimizasyon dizisi işlemleri

Böyle bir kaynak dizisi vardır:

0-yok özelliği, 1
int[] dataArray = new int[10] {0, 1, 1, 1, 0, 0, 0, 0, 1, 0}; 

- mevcut bulunmaktadır. Bu

public struct MyDataStruct 
{ 
    public int Index; //index in array 
    public int Value; //some value 
} 

ayrıca bazı özelliğin reprezentation iki yolu vardır: ideal olarak ben SADECE OptimizedKeyValueArray1 kullanmak ve NotOptimizedKeyValueArray1 tüm usings kaldırmak gerekir. Ben yinelerler çünkü

int[] inputArray = new int[10] {0, 1, 1, 1, 0, 0, 0, 0, 1, 0}; 

MyDataStruct[] resultDataSet = new MyDataStruct[10]; 

, ölçeklenebilir Bu, bu görevin benim çözüm, ancak optimize edilmediğini ve yok: Ben resultArray, inputArray aynı miktar olması gerekir Sonuç olarak

public static readonly MyDataStruct[] NotOptimizedKeyValueArray1 = 
     { 
       new MyDataStruct(0, -1), 
       new MyDataStruct(1, 1000), 
       new MyDataStruct(2, 2500), 
       new MyDataStruct(3, 4500), 
       new MyDataStruct(4, -1), 
       new MyDataStruct(5, -1), 
       new MyDataStruct(6, -1), 
       new MyDataStruct(7, -1), 
       new MyDataStruct(8, 6500), 
       new MyDataStruct(9, -1) 
     }; 

public static readonly MyDataStruct[] OptimizedKeyValueArray1 = 
     { 
       new MyDataStruct(1, 1000), 
       new MyDataStruct(2, 2500), 
       new MyDataStruct(3, 4500), 
       new MyDataStruct(8, 6500) 
     }; 

Benim için önemli olmayan unsurlar üzerinde ve onu çok başlangıçtan biliyorum. Sonuç olarak ben 10 unsurları vardır:

for(int i = 0; i < dataArray.Length; i++) 
{ 
    resultDataSet[i] = new MyDataStruct(i, dataArray[i]); 
} 

Ama nedense daha verimli çalışması ve 0 değerli elemanları üzerinde ilerlerken DEĞİL gerekir. Ancak, bu kod uyarınca, yalnızca 4 eleman oluşturacağım, bazı varsayılan değerler ile diğer 6 öğeye sahip olmam gerekiyor. Ve daha verimli bir şekilde nasıl yapılacağını bilmiyorum. Bu görevi gerçekleştirmek için dizi üzerinde daha verimli algoritmalar önerebilirsiniz. Teşekkürler.

+1

kullanımını bu linq deyimi int [] inputArray2 = inputArray.Where (öğe => madde == 1) .ToArray() ; gereksinimi göre sadece dört öğe almak ve daha sonra döngü üzerinde çalıştırmak için – rashfmnb

+0

Hayır linq, kullanamıyorum. – yozhik

+0

Bu ev ödevi mi? Yalnızca etkinleştirilmiş değerler üzerinde yinelemek istiyorsanız, diziyi featureflag ile sıralamanız gerekir. Ardından, basit bir son durum olan engelli bir özelliğe basana kadar dizinin üzerine tekrar girebilirsiniz. –

cevap

1

değil ne demek tamamen emin, sen NotOptimized dizi ya da sadece Optimize biri, bu 1 diziden unsurları alabilir eğer yapardım nasıl kullanmak istiyorsanız biraz belirsiz:

const int arraySize = 10; 

//No need int[] if only 0 & 1 
bool[] dataArray = new bool[arraySize] {false, true, true, true, false, false, false, false, true, false}; 

List<MyDataStruct> resultDataSet = new List<MyDataStruct>(); 
//You must iterate on all dataArray, no real way around it 
for(int i = 0; i < arraySize; i++) 
{ 
    if (dataArray[i]) 
     resultDataSet.Add(NotOptimizedKeyValueArray1[i]); 
} 

o zaman başka dizi kullanması gereken unsurların aynı sayıda gerekiyorsa:

MyDataStruct[] resultDataSet = new MyDataStruct[arraySize]; 
for(int i = 0; i < arraySize; i++) 
{ 
    if (dataArray[i]) 
     resultDataSet[i] = NotOptimizedKeyValueArray1[i]; 
    else 
     resultDataSet[i] = new MyDataStruct(); //whatever your default is. 
} 
+0

Ancak, sonuçta resultDataSet'inde değerlerle birlikte sadece 4 öğe alacağım. Ve hepsine 10 sahip olmam gerekiyor, ancak 6 tanesi varsayılan değerlerle olmalı. – yozhik

+0

Ive benim anser @yozhik düzenledi –