2014-05-15 41 views
4

我有要實例化一個int[] building;動態基於另一陣列int[] info;建築INT []從另一個值INT []

info的將持有int範圍從0-48

要構建building array ..如果info數組中的索引ind中存在非零值,我想將該索引添加到building數組中。

所以,如果info看起來像這樣{0, 12, 24, 48}我想構建顯示{1, 2, 3}另一個例子{12, 0, 0, 48} - >{0, 3}

有一個整潔的一個襯墊做到這一點?

如何我已經做了

int[] info = new int[]{12, 0, 0, 48}; 
List<int> indxs = new List<int>(); 
for (int i = 0; i < info.Length; i++) 
    if (info [i] > 0) 
     indxs.Add(i); 
int[] building = indxs.ToArray(); 
+2

您使用的語言不是C++,但問題是標記爲C++。請解決這個**不一致**。調整標記或示例。 –

+0

你可能會寫一個助手,比如'IndexesWhere',類似於'System.Linq.Enumerable.Where'。 – ach

+1

你有沒有特別的理由讓它成爲一個班輪?您可以在實用程序庫中創建方法,或者更好地使用[擴展方法](http://msdn.microsoft.com/zh-cn/library/bb383977.aspx)。你應該始終重視長度的可讀性。 – mason

回答

4
var building = info.Select((i, idx) => i == 0 ? -1 : idx) 
        .Where(i => i != -1) 
        .ToArray(); 

這將讓你在同一個陣列作爲你現在得到。

這裏是我用來證明其整個控制檯應用程序:

class Program 
{ 
    static void Main(string[] args) 
    { 
     int[] info = new int[] { 12, 0, 0, 48 }; 
     List<int> indxs = new List<int>(); 
     for (int i = 0; i < info.Length; i++) 
      if (info[i] > 0) 
       indxs.Add(i); 
     int[] building = indxs.ToArray(); 

     var newBuilding = info.Select((i, idx) => i == 0 ? -1 : idx) 
      .Where(i => i != -1) 
      .ToArray(); 
    } 
} 

兩個buildingnewBuilding爲您提供相同的輸出。

2
var filtered = info.Select((x,i) => new { Value = x, Index = i}) 
        .Where(x => x.Value > 0) 
        .ToArray(); 
+1

+1;這是另一種解決問題的方法。 –