22

このようなもの:

var myObject = new MyClass()
{
    x = " ".Select(y =>
    {
        //Do stuff..
        if (2 + 2 == 5)
            return "I like cookies";
        else if (2 + 2 == 3)
            return "I like muffins";
        //More conditions...
        else
            return "I'm a bitter old man";
    })
};

Select はこのように使用することを意図していないことを認識しています。しかし、ええ、同じことを行う他の方法は何ですか?

4

6 に答える 6

24

実際のコードの場合は関数にします...娯楽目的の場合、JavaScript IIFEに相当する C#は以下よりも直接的ですSelect:

var myObject = new MyClass()
{
   x =((Func<int>)(() => {return 2;}))(),...
于 2013-08-16T18:12:22.467 に答える
5

確かに「公式」ではありません、コンストラクターまたは別のファクトリー/ビルダーメソッドでオプションの名前付きパラメーターを使用できます。

public class MyClass
{
   public string x { get; private set; }

   public MyClass(Func<string> x = null)
    {
        if (x != null)
            this.x = x();
    }
}

次のような使い方で:

var myClass = new MyClass(
        x: () =>
            {
                //Do stuff..
                if (2 + 2 == 5)
                    return "I like cookies";
                else if (2 + 2 == 3)
                    return "I like muffins";
                //More conditions...
                else
                    return "I'm a bitter old man";
            }
    );

    Console.WriteLine(myClass.x); //"I'm a bitter old man"

したがって、それはあなたが求めていた正確な構文ではありませんが、かなり近く、LINQ の奇妙さをスキップします。

そうは言っても、私はそれが好きではありません。思考の糧として提供するだけです。:)


編集:コンストラクターを変更できない(または変更したくない)クラスでこれを使用している可能性があるため、ファクトリメソッドスタイルを追加すると思いました:

public static class MyFactory
{
    public static MyClass CreateMyClass(Func<string> x = null)
    {
        var myClass = new MyClass()

        if (x != null)
                myClass.x = x();

        return myClass;
    }
}

同様の使用法 (代わりにファクトリ メソッドを呼び出すだけ):

var myClass = MyFactory.CreateMyClass(
    x: () =>
        {
            //Do stuff..
            if (2 + 2 == 5)
                return "I like cookies";
            else if (2 + 2 == 3)
                return "I like muffins";
            //More conditions...
            else
                return "I'm a bitter old man";
        }
);

編集:そしてねえ、私たちがそれに取り組んでいる間。深いところから離れて、別のビルダーでそれを行い、暗黙の演算子を悪用してみませんか!

public class MyClassBuilder
{
    public Func<string> x { get; set; }

    public static implicit operator MyClass(MyClassBuilder builder)
    {
        var myClass = new MyClass();

        if (builder.x != null)
            myClass.x = builder.x();

        return myClass;
    }
}

次のような使い方で:

MyClass myClass = new MyClassBuilder
{
    x = () =>
        {
            //Do stuff..
            if (2 + 2 == 5)
                return "I like cookies";
            else if (2 + 2 == 3)
                return "I like muffins";
            //More conditions...
            else
                return "I'm a bitter old man";
        }
};

したがって、構文は同じです、使用する代わりにインスタンスを明示的に入力する必要があります。var

于 2013-08-16T18:17:30.623 に答える
4

これが私の同僚が思いついたものです:

var myObject = new { 
    x = new Func<int>(() => {return 2;})() 
};

これはアレクセイの答えに基づいていることに注意してください。

于 2013-08-16T18:24:18.397 に答える