2016-08-18 45 views
3

我對C#來說很新奇,而且我看到很多代碼,我不太熟悉語法。所以我想知道是否有一些更簡單的方式來做我在這裏做的事情:數組作爲屬性。尋找更簡單的方法來填充數組

我有一個具有各種屬性和功能的類。其中之一是public int gettypeforitem(int i),它返回一個整數。 我想定義int[]類型的屬性,它返回所有項目類型的數組。我來自C++,所以下面的代碼對我來說似乎是邏輯的,但我想知道在C#中這樣做是否有更「直接」的方式。 謝謝!

public int[] type 
{ 
     get 
     { 
      List<int> _list = new List<int>(); 
      for(uint i=0; i<NumberOfItems;i++) 
       _list.Add(gettypeforitem(i)); 
      return _list.ToArray(); 
     } 
} 
+0

正如對下面提供的答案註釋,因爲你說你是新來的C#..確保當使用提供的答案時,你包含'System.Linq'命名空間。 –

回答

3

你既然知道項目的數量,你可以創建一個數組直線距離:

int[] _arr = new int[NumberOfItems]; 
for(uint i=0; i<NumberOfItems;i++) 
    _arr[i] = gettypeforitem(i); 
return _arr; 

或者,如果你不關心的開銷:

Enumerable.Range(0, NumberOfItems).Select(gettypeforitem).ToArray(); 
13
public int[] type 
{ 
    get 
    { 
     return Enumerable.Range(0, NumberOfItems).Select(gettypeforitem).ToArray(); 
    } 
} 

更新: 正如評論中所建議的那樣,最好保持C#命名爲sta ndards:

public int[] Types 
{ 
    get 
    { 
     return Enumerable.Range(0, NumberOfItems).Select(getTypeForItem).ToArray(); 
    } 
} 
+4

您可以使用方法組而不是lambda來簡化選擇。即'Select(gettypeforitem)' –

+0

好點@Glorin Oakenfoot,現在更新我的答案。 – serhiyb

+0

因爲我們在C#領域,所以不要使用公共屬性的小寫字母。 只讀屬性,而不是方法挫敗我。可能我錯了,但我認爲它打破了屬性語義。 所以,請不要教新手做壞事) –

20

LINQ是向前來這裏的路上,我會說:

public int[] Types => Enumerable.Range(0, NumberOfItems) 
           .Select(i => GetTypeForItem(i)) 
           .ToArray(); 

我已經改變了名稱,以遵循.NET命名約定,這是用C#6的表情濃郁屬性語法。

由於這是在做一個比較大的工作量對於一個屬性 - 生成一個新的數組每個呼叫,一開始 - 你可能要考慮將其替代的方法:

public int[] GetTypes() => Enumerable.Range(0, NumberOfItems) 
            .Select(i => GetTypeForItem(i)) 
            .ToArray(); 

正如指出的評論其他地方,你可以能夠使用的方法組轉換爲參數的Select方法:

public int[] GetTypes() => Enumerable.Range(0, NumberOfItems) 
            .Select(GetTypeForItem) 
            .ToArray(); 

何時方法組轉換作爲參數總是EL有效的確切規則對我說,所以我不會在這裏總結他們。 (他們也隨時間變化了。)

+0

這看起來很有希望。儘管我遇到了一個問題,因爲我的'GetTypeForItem(uint i)'只接受'uint','Select'中的'i'似乎使用'int'。我能否以某種方式修改「我」的類型? – tzippy

+0

@tzippy:你可以投它。但是你也可以考慮改變你的'GetTypeForItem'方法 - 而'uint' *聽起來像一個好主意,你會發現很多.NET代碼真的是基於'int'。 –

2

屬性的返回類型是否必須是一個真正的數組?如果沒有,你也可以替代使用:

public IEnumerable<int> type 
{ 
     get 
     { 
      for(uint i=0; i<NumberOfItems;i++) 
       yield return gettypeforitem(i); 
     } 
} 

然後:

myObject.type.ToArray(); 
相關問題