我可以使用单行程来更改数组中所有对象的值吗?
例如,我有一个[空]控件数组:
Dim myArr(9) As Control
控件是一个对象引用类型,所以在实例化之前我不能使用数组中的每个元素:
myArr(0) = New Control()
我知道我需要多少项,而且我知道我需要实例化每一个对象,所以有没有办法使用快速单行实例化数组中的所有项目?现在我正在做这个,这没关系,但是有一个班轮就好了。
For i As Int32 = 0 To myArr.Length - 1
myArr(i) = New Control()
Next
同样,如果我有一个整数数组,如何更改单行中的所有值?假设我想将每个值乘以2,例如。
我已经沉迷于Ruby中的.map!
函数,我想在.NET中做一些同样优雅的事情。
答案 0 :(得分:3)
你可以使用LINQ - 我见过这样的代码:
var array = Enumerable.Range(0, size).Select(_ => new Control()).ToArray();
我不确定等效的VB代码,但我确信其他人可以在必要时提供 - 并且您的代码只指定“.NET”:)
我个人明确地说,为了清楚起见(并且它也更有效)。
当然,你总是可以创建自己的方法:
public static T[] PopulateArray<T>(Func<T> initializer, int size)
{
T[] ret = new T[size];
for (int i = 0; i < size; i++)
{
ret[i] = initializer();
}
}
然后:
var array = PopulateArray(() => new Control(), 10);
答案 1 :(得分:1)
我使用Update()扩展方法让自己能够更新通过LINQ查询获得的集合。
public static class LinqExtensions
{
public delegate void Func<Argument>(Argument item);
public static bool Update<SourceType>(this IEnumerable<SourceType> source, Func<SourceType> updater)
{
if (null == source)
throw new ArgumentException("Update extension method was given null source.");
if (null == updater)
throw new ArgumentException("Update extension method was given null updater.");
foreach (SourceType item in source)
updater(item);
return true;
}
}
从那里我只写一个函数,我可以应用于所有正在更新的项目。这是一个简单的“地图”,就像常规一样。例如,我在WinForms控件中使用了它。