数组作为属性.正在寻找填充数组的更简单方法

本文关键字:数组 填充 更简单 方法 寻找 属性 | 更新日期: 2023-09-27 18:03:10

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

数组作为属性.正在寻找填充数组的更简单方法

LINQ是这里的前进之路,我想说:

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

我已经更改了名称以遵循.NET命名约定,这是使用C#的表达式体属性语法。

由于这要为一个属性做相对大量的工作——首先,每次调用都要生成一个新数组——您可能需要考虑将其作为一种方法:

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

正如其他地方的注释中所指出的,您可能能够使用方法组转换将参数转换为Select方法:

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

当方法组转换作为参数有效时,我总是无法确定确切的规则,所以我不会在这里总结它们。(它们也随着时间的推移而变化。(

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

既然知道项目的数量,就可以直接创建一个数组:

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

属性的返回类型必须是真正的数组吗?如果没有,你也可以使用这个:

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

然后:

myObject.type.ToArray();