2011-01-04 11 views
2

私は漠然としたタイトルのために申し訳ありませんが、私はあなたが本当に私が何を意味するか知っているスニペットを見るために持っていると思う:このコードスニペットはどのように短縮できますか?

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

私は1行で(私は非常に頻繁にこのスニペットを使用することをしたいのですが)。それはどのように可能でしょうか?

+0

注:もちろん、私は単純に[] floatを返すようにFillFoosを編集することはできません。 – Lazlo

+0

なぜできないのですか?更新された入力値を返します。 –

+0

1つのライナーの理由は何ですか? – JonH

答えて

2

、あなたは配列を割り当てて、それを埋めるために供給し、デリゲートを使用して、一般的な機能を作ることができます:

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

をそしてこのDOのようにそれを使用します。

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

これはもっとも論理的な解決策ですが、残念ながらActionにはより多くの可能性のあるシグネチャがあるため、私のコンテキストでは機能しません。それにもかかわらず。 – Lazlo

+0

まあ、余分なパラメータでフィル関数を呼び出したり、ラムダ構文を使ってインラインでアクションを書くことができる関数オーバーロードを作ることができます。私はあなたが興味を持っているかどうかを精緻にすることができます... –

+0

詳細を詳述する必要はありません。ありがとう。 – Lazlo

3

FillFoos機能を変更できない場合、スニペットは可能な限り短くなります。

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

をしかし、それはまだ3つの文だと読み、かなり厳しいです:

あなたは、もちろん、これを行うことができます。

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

あなたも、それは一般的なことができます:

012あなたはこのようにそれを呼び出すことができます
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)を呼び出してください。 C#ので

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]); 
関連する問題