这是一些(显然)无法编译的代码:
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;
}
}
};
你明白了;我正在尝试计算 CalcField
以完全不同的方式,取决于 SomeField
的值是。我不能使用 Func<>
(或者我可以吗?),因为输入类型是匿名的。那么让它工作的正确语法是什么?
最佳答案
首先,对于 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
};
});
如果不使用方法链,您需要一个方法或一个 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) };
注意:我不是在 IDE 中编写的,所以请原谅任何简单的错误。
这是 dynamic 的 MSDN .但是,我发现一旦需要开始传递匿名类型,最好创建一个实际的类。
关于c# - 在 Linq 查询中执行代码块的语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16466731/