在c# / LINQ中是否有一种方法可以生成,发出或以其他方式实现先前为空的数组?

本文关键字:其他 方式 实现 数组 是否 LINQ 方法 一种 | 更新日期: 2023-09-27 18:12:36

我有一个动态字符串数组的对象,我已经实现如下:

public class MyThing { 
    public int NumberOfThings { get; set; }
    public string _BaseName { get; set; }
    public string[] DynamicStringArray {
        get {
            List<string> dsa = new List<string>();
            for (int i = 1; i <= this.NumberOfThings; i++) {
                dsa.Add(string.Format(this._BaseName, i));
            }
            return dsa.ToArray();
        }
    }
}

我试图更早一点,并实现一些东西,自动创建格式化的数组列表在LINQ,但我已经设法失败。

作为我正在尝试的事情的一个例子:

int i = 1;
// create a list with a capacity of NumberOfThings
return new List<string>(this.NumberOfThings)
    // create each of the things in the array dynamically
    .Select(x => string.Format(this._BaseName, i++))
    .ToArray();

在这种情况下它真的不是很重要,性能方面它实际上可能更糟,但我想知道是否有一个很酷的方法来构建或发出一个数组在LINQ扩展

在c# / LINQ中是否有一种方法可以生成,发出或以其他方式实现先前为空的数组?

Range会有帮助吗?

return Enumerable
  .Range(1, this.NumberOfThings)
  .Select(x => string.Format(this._BaseName, x))
  .ToArray();

你的属性可以返回一个IEnumerable,然后你可以调用ToArray()扩展,如果你需要的话。

public string[] DynamicStringArray
{
    get
    {
        for (int i=1; i <= this.NumberOfThings; i++)
            yield return string.Format(this._BaseName, i);
    }
}

然而,由于上下文的切换,yield本身就很慢。你最好这样做:

public string[] DynamicStringArray
{
    get
    {
        string[] result = new string[this.NumberOfThings];
        for (int i = 0; i < this.NumberOfThings; i++)
        {
            result[i] = string.Format(this._BaseName, i + 1));
        }
        return result;
    }
}

当你感到懒惰时,这些Linq扩展方法是很好的。但如果你需要它表现良好,你应该避免它们。

我宁愿重新设计一点当前的解决方案:

  public class MyThing { 
    ...
    // Note IEnumerable<String> instead of String[]
    public IEnumerable<String> DynamicString(int numberOfThings) {
      if (numberOfThings < 0)
        throw new ArgumentOutOfRangeException("numberOfThings");
      for (int i = 0; i < numberOfThings; ++i)
        yield return string.Format(this._BaseName, i + 1);
    } 
  }

当你想要,比如说,一个数组,你可以很容易地获得它:

  MyThing thing = ...;
  // Add .ToArray() to have an array
  String[] myArray = thing.DynamicString(18).ToArray();

但是当你想要的只是循环时,就不需要创建数组或列表(materialize a result)

  // no materialization: no array of 1000000 items
  foreach (String item in thing.DynamicString(1000000)) {
    ...
  }