0

これが私のコードです:

var query = from x in Data

select new { Fruit = x[0], Animal, x[2], Color = x[3], Food = x[4] };

ここで、ユーザーが「ボックス 1」をチェックすると、次のように別のクエリを実行するようにチェックボックスを作成したいと考えています。

select new { Fruit = x[7], Animal, x[4], Color = x[8], Food = x[9] };

私の質問は、どのチェックボックスがチェックされているかに応じて、異なるselect...newステートメントが使用されるようにするにはどうすればよいですか?

複数の if/then ステートメントを使用して、どの特定のボックスがチェックされているかを確認し、どのselect...newステートメントを使用するかを決定できると思いますが、もっと良い方法があると思います。

VB では、"case" ステートメントが有効になると思いますが、C# に相当するものが何であるかはわかりません。

クエリパラメーターを変更するコンテキストでケース/スイッチを実装しようとして失敗しました:

int caseSwitch = 1;
var query = from x in Data

switch (caseSwitch)
{

       case 1:
           select new { Fruit = x[0], Animal, x[2], Color = x[3], Food = x[4] };
           break;

       case 2:
           select new { Fruit = x[7], Animal, x[4], Color = x[8], Food = x[9] };
           break;
}
4

2 に答える 2

1

選択項目を関数に分解できます。

function object getItem(DataItem x, int caseSwitch)
{
    switch (caseSwitch)
    {
       case 1:
           return new { Fruit = x[0], Animal, x[2], Color = x[3], Food = x[4] };
           break;
       case 2:
           return new { Fruit = x[7], Animal, x[4], Color = x[8], Food = x[9] };
           break;
    }
}

そして、次のクエリを実行できます。

int caseSwitch = 1;
var query = from x in Data
            select getItem(x, caseSwitch);
于 2013-10-04T21:29:10.590 に答える
1

クエリを変更するには、switchステートメントを使用できます。ただし、その場合、匿名型は使用できません。宣言時にクエリ オブジェクトを定義できるように、使用できるオブジェクトを定義する必要があります。

public class Foo
{
    public string Fruit { get; set; }
    public string Animal { get; set; }
    public string Color { get; set; }
    public string Food { get; set; }
}

IEnumerable<Foo> query = null;
switch (caseSwitch)
{
    case 1:
        query = from x in Data
                select new Foo { Fruit = x[0], Animal = x[2], Color = x[3], 
                    Food = x[4] };
         break;

     case 2:
         query = from x in Data
                select new Foo { Fruit = x[7], Animal = x[4], Color = x[8],
                    Food = x[9] };
         break;

     default:
         // handle however you need to
}

LINQ クエリに完全にインライン化することもできますが、コードを複数のケースに拡張すると、コードの理解と保守が難しくなります。

var query = from x in Data
            // needed to get the caseSwitch value into context in the select
            //  otherwise it is considered out of context
            let sw = caseSwitch  
            select sw == 1 ?
                new { Fruit = x[0], Animal = x[2], Color = x[3], Food = x[4] } :
                new { Fruit = x[7], Animal = x[4], Color = x[8], Food = x[9] }

このアプローチの問題は、caseSwitchが有効な値の範囲外にある場合に、必要のない値を取得する可能性があることです。これは、クエリをデフォルト値に設定するか、ケースに到達switchしたときに例外をスローできるステートメントを使用して処理することをお勧めします。default

3 つ以上のケースがあるインライン LINQ の例

var query = from x in Data
            let sw = caseSwitch  
            select 
                sw == 1 ? new { Fruit = x[0], Animal = x[2], Color = x[3], Food = x[4] }
                : sw == 2 ? new { Fruit = x[7], Animal = x[4], Color = x[8], Food = x[9] }
                : sw == 3 ? new { Fruit = x[10], Animal = x[11], Color = x[12], Food = x[13] }
                : null; // final value is the default value
于 2013-10-04T21:29:32.220 に答える