射影
このトピックの例では、イベントを出力するための変換の一環として、個々のイベントに対して特定の計算を実行する方法を示します。このような計算を実行するには、射影を使用します。射影は、CepStream<T1> ストリームに対して機能し、CepStream<T> が T 型のペイロードを持つイベントのストリームとなる新しい CepStream<T2> ストリームを生成します。LINQ 内で select 句を使用すると、射影が必ず生じます。射影によって、次に示すように、暗黙的に新しい種類を作成することも、明示的に定義済みのイベントの種類を参照することもできます。
使用例
次の例では、クエリに定義された射影式に従って、ストリーム TestEventStream 内のすべてのイベントを新しいイベントに射影します。このクエリでは、フィールド i および f に 2 を乗算しています。これらの値は、新しいイベントに射影されます。この新しいイベントの種類は匿名型で、射影式によって作成されたフィールドの割り当てを介して、暗黙的に定義されます。
// Assuming the following input event type:
public class MyPayload
{
public int i;
public float f;
}
var queryProject = from c in TestEventStream
select new {i = c.i * 2, f = c.f * 2};
次の例では、明示的に宣言されたイベントの種類 MeterWattage を使用して、種類 MeterReading の入力ストリームの各イベントをストリーム realValueStream 内の新しいイベントに射影します。InputStream ストリーム内の各イベントの consumption フィールドは、double CLR 型に変換され、10 で除算された後に、種類 MeterWattage の wattage フィールドに割り当てられます。
public class MeterReading
{
public int consumption;
}
public class MeterWattage
{
public double wattage;
}
[…]
var realValueStream = from e in InputStream
select new MeterWattage {wattage = (double)e.consumption / 10};
射影式には、型のコンストラクターを使用できません。MemberInit 式を使用して必ず新しい (暗黙的または明示的な) 型にフィールドの割り当てを指定する必要があります (中かっこ内でのイベント フィールドの割り当て)。ただし、次の例のように、この構文はプリミティブ型の単一フィールドを投影する場合は必要ではありません。
public class MeterReading
{
public int consumption;
}
public class MeterWattage
{
public double wattage;
}
[…]
var realValueStream = from e in InputStream
select (double)e.consumption / 10;
この投影によって暗黙的にプリミティブ型 double の CepStream が生成されます。
明示的な型を使用する場合は、そのフィールドまたはプロパティを射影式で初期化する必要があります。