2016-08-18 46 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(); 
相关问题