数组作为属性。寻找更简单的方法来填充数组

时间:2016-08-18 14:21:45

标签: c# arrays

我对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();
      }
}

4 个答案:

答案 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();