这里有一些代码(显然)无法编译:
var q = from x in myAnonymousTypeCollection
select new {
x.ID,
CalcField = {
switch(x.SomeField) {
case 1:
return Math.Sqrt(x.Field1);
case 2:
return Math.Pow(x.Field2, 2);
default:
return x.Field3;
}
}
};
Run Code Online (Sandbox Code Playgroud)
你得到了照片; 我试图以CalcField完全不同的方式计算,具体取决于价值SomeField.我不能使用Func<>(或者我可以?),因为输入类型是匿名的.那么什么是正确的语法来实现这一点?
cad*_*ll0 12
首先,我通常更喜欢方法链语法而不是Linq的查询语法.有了它,你可以轻松地做到这一点.
var q = myAnonymousTypeCollection
.Select(x =>
{
object calcField;
switch(x.SomeField)
{
case 1:
calcField = Math.Sqrt(x.Field1);
case 2:
calcField = Math.Pow(x.Field2, 2);
default:
calcField = x.Field3;
return new
{
x.ID,
CalcField = calcField
};
});
Run Code Online (Sandbox Code Playgroud)
不使用方法链,您需要方法或Func.我们假设一个Func
//replace these with actual types if you can.
Func<dynamic, dynamic> calculateField =
x =>
{
switch(x.SomeField) {
case 1:
return Math.Sqrt(x.Field1);
case 2:
return Math.Pow(x.Field2, 2);
default:
return x.Field3;
}
var q = from x in myAnonymousTypeCollection
select new { x.Id, CalcField = calculateField(x) };
Run Code Online (Sandbox Code Playgroud)
注意:我没有在IDE中写这个,所以请原谅任何简单的错误.
这是动态的MSDN .但是,我发现一旦你需要开始传递匿名类型,最好是创建一个实际的类.
您可以将匿名函数包装为(自执行)Func<>委托.这假设您知道返回类型.
var q = from x in myAnonymousTypeCollection
select new {
ID = x.ID,
CalcField = new Func<double>( () => {
switch(x.SomeField) {
case 1:
return Math.Sqrt(x.Field1);
case 2:
return Math.Pow(x.Field2, 2);
default:
return x.Field3;
}
} )()
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6010 次 |
| 最近记录: |