我对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 :(得分: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();
方法组转换何时作为参数有效的确切规则总是躲避我,所以我不会在这里总结它们。 (他们也随着时间而改变。)
答案 1 :(得分:13)
public int[] type
{
get
{
return Enumerable.Range(0, NumberOfItems).Select(gettypeforitem).ToArray();
}
}
<强>更新强> 正如评论中所建议的那样,最好保持C#命名标准:
public int[] Types
{
get
{
return Enumerable.Range(0, NumberOfItems).Select(getTypeForItem).ToArray();
}
}
答案 2 :(得分: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();
答案 3 :(得分:2)
属性的返回类型是否必须是一个数组?如果没有,您也可以使用它:
public IEnumerable<int> type
{
get
{
for(uint i=0; i<NumberOfItems;i++)
yield return gettypeforitem(i);
}
}
然后:
myObject.type.ToArray();