在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扩展
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)) {
...
}