在.NET中是否有单行更改数组中所有对象的值?

时间:2012-01-05 19:47:21

标签: .net

我可以使用单行程来更改数组中所有对象的值吗?

例如,我有一个[空]控件数组:

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中做一些同样优雅的事情。

2 个答案:

答案 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控件中使用了它。