如何缩短此代码段?

时间:2011-01-04 20:17:41

标签: c#

我很抱歉这个模糊的标题,我想你真的必须看到片段才知道我的意思:

float[] foo = new float[3];
FillFoos(foo);
return foo;

我想把它放在一行(我经常使用这个片段)。怎么可能呢?

5 个答案:

答案 0 :(得分:3)

如果您无法更改FillFoos功能,那么您的代码段就会尽可能短。

当然,你可以这样做:

float[] foo = new float[3]; FillFoos(foo); return foo;

但这仍然是三个陈述,并且相当难以阅读。

答案 1 :(得分:3)

你可以创建一个函数:

public float[] GetFoos()
{
    float[] foo = new float[3];
    FillFoos(foo);
    return foo;
}

编辑:如果您需要更改数组的大小和填充数组的方法,那么您可以这样做:

public float[] GetFoos(int count, Action<float[]> populateAction)
{
    float[] items = (float[])Array.CreateInstance(typeof(float), count);
    populateAction(items);
    return items;
}

然后你可以这样称呼它:

float[] items = GetFoos(3, FillFoos);

你甚至可以使它成为通用的:

public T[] GetFoos<T>(int count, Action<T[]> populateAction)
{
    T[] items = (T[])Array.CreateInstance(typeof(T), count);
    populateAction(items);
    return items;
}

答案 2 :(得分:2)

在C#中,您可以创建一个分配数组的泛型函数,并使用提供的委托来填充它:

 public static T[] AllocAndFill<T>(Action<T[]> fillAction, int count)
 {
      T[] array = new T[count];
      fillAction(array);
      return array;
 }

并像这样使用它:

 var result =  AllocAndFill<float>(FillFoos,3);

答案 3 :(得分:0)

用另一种方法包裹它。

T[] GetObjects<T>(int length) 
{
    T[] foo = new T[length]; 
    FillFoos(foo); 
    return foo; 
}

现在,不要在任何地方使用该代码段,只需致电GetObjects<Foo>(3)

答案 4 :(得分:0)

如果您无法更改FillFoos,那么您可以编写某种辅助方法(可能作为包含FillFoos的任何对象的扩展方法)。

public static class Extensions
{
    public static float[] SuperFoo(this FooObject foo, float[] floats)
    {
        foo.FillFoos(floats);
        return floats;
    }
}

然后:

return fooObj.SuperFoo(new float[3]);