c# - 在 Linq 查询中执行代码块的语法?

标签 c# linq

这是一些(显然)无法编译的代码:

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/

相关文章:

c# - 在不使用 Interop-DLL 的情况下在 Visual Studio C# 中使用 COM+ 对象

Qt 中等效的 C# 用户控件事件

vb.net - Linq - 从不同列表类型中排除项目

c# - 如何在 C# linq 查询中按业务类型代码选择前 (5) 个贡献者组

c# - 林克到 SQL : Most Efficient Way of Looping through List of ID's

c# - 错误 CS7069 对类型 'Image' 的引用声称它是在 'System.Drawing' 中定义的,但找不到

c# - 为什么 MouseMove 不会在自定义 FrameworkElement 上触发?

c# - 样式 LonglistMultiselector windows phone 8

c# - 使用 LINQ 将 DateTime?[] 中的 null 替换为 DateTime.MaxValue

c# - LINQ 无法识别 select 子句中的连接表