2011-01-04 2 views
2

Я извиняюсь за туманной титул, я думаю, что вы действительно должны увидеть фрагмент кода, чтобы знать, что я имею в виду:Как я могу сократить этот фрагмент кода?

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

Я хотел бы иметь, что в одной строке (я использую этот фрагмент очень часто). Как это возможно?

+0

Примечание: Конечно, я не могу редактировать FillFoos просто вернуть поплавок []. – Lazlo

+0

Почему вы не можете? просто верните обновленные входные значения. –

+0

И ваша причина для одного лайнера? – JonH

ответ

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); 
+0

Это наиболее логичное решение, к сожалению, оно не будет работать в моем контексте, так как у Action есть много более возможных подписей. Принято все же. – Lazlo

+0

Ну, вы можете сделать перегрузку функции, которая позволяет вам вызвать функции заполнения с дополнительными параметрами или использовать синтаксис лямбда для написания действия inline. Я могу уточнить, если вы заинтересованы ... –

+0

Не нужно уточнять, я понимаю. Благодарю. – Lazlo

3

Если вы не можете изменить функцию FillFoos, то ваш фрагмент будет как можно короче.

Вы могли бы, конечно, сделать это:

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

Но это еще три заявления и довольно трудно читать.

+0

+1 для смеха. :) – Lazlo

+0

+1, очень интересно :) –

3

Вы можете просто создать функцию:

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

EDIT: Если вам необходимо изменить размер массива и метод, чтобы заполнить массив, то вы можете сделать это:

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; 
} 
+0

Я бы сделал его статическим. – kemiller2002

+0

Это не всегда foo, не всегда 3 поплавки, и не всегда FillFoos. Это разные функции, которые заполняют массивы с плавающей запятой. – Lazlo

+0

Вы можете сделать метод Generic и принять длину массива в качестве аргумента. –

0

Оберните его другим способом.

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

Теперь, вместо того, чтобы использовать этот фрагмент кода везде, просто вызовите GetObjects<Foo>(3).

0

Если вы можете 't change 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]); 
Смежные вопросы