c# - 在 select 语句中声明显式类型而不是 var

标签 c# linq

我正在执行以下请求。它按预期工作并返回结构正确的数据。 (它创建一个具有对应于公共(public)字段的“head”的元素,并将该字段中具有相同值的所有元素作为“tail”中的数组。)

var result
  = from A in As
    group A by A.F into B
    select new 
    {
      F1 = B.Key,
      F2 = from A in As
           where A.F == B.Key
           select A
    };

现在我想明确声明它的类型。我已经在调试器中检查过我对类型的假设是正确的,但是,当我尝试声明它时,它会给我转换错误。

  1. 为什么?
  2. 如何显式声明类型?

我尝试了不同的声明和as变体,但都失败了。

IEnumerable<Tuple<String, IEnumerable<MyType>>> result 
  = from ...
    } as Tuple<String, MyType>;

我知道这是可行的,但我缺乏正确完成它的经验。我注意到以下工作。但是,我不确定如何更进一步,将 Object 替换为实际的变量类型。

IEnumerable<Object> result 
  = from ...
    } as Object;

最佳答案

尽管您知道“内部”对象是相同的,但 C# 是静态类型化的,并且根据元数据(名称、命名空间...)而不是成员来解析类型。您选择了匿名类型,而不是 Tuple,因此类型解析器无法“同意”将其用作 Tuple

如果你在 Visual Studio 中将鼠标悬停在 var 关键字上,它会告诉你它是什么类型(因为它必须在编译时知道,除非它是 dynamic ).但是,由于您使用的是匿名类型,您将无法显式编写该类型 - 它在 C# 源代码中没有名称。

你可能做的是在别处定义类型

internal class MyObj
{
    public MyObj(string head, IEnumerable<Foo> tail)
    {
        Head = head;
        Tail = tail;
    }

    public string Head { get; set; }
    public IEnumerable<Foo> Tail { get; set; }
}

然后在您的查询中使用它:

IEnumerable<MyObj> result
  = from A in As
    group A by A.F into B
    select new MyObj(
        B.Key,
        from A in As
        where A.F == B.Key
        select A);

或者按照乔恩的建议使用元组 here .

关于c# - 在 select 语句中声明显式类型而不是 var,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14359007/

相关文章:

c# - base.OnStartup(e) 是做什么的?

c# - APNS PushSharp 在生产环境中不工作

c# - 在 Xamarin iOS 中以编程方式设置 UITableViewCell 样式

c# - 按键 + 列表中的值对 Dictionary<int, List<int>> 进行排序

C# 等效于 DecryptByPassPhrase

c# - 当前用户全局变量 C# 桌面应用程序

c# - Linq 列表包含方法

c# - 如果有重复项,Linq 只删除一项

c# - 我们是否需要 LINQ 中的外部连接的连接子句?

c# - 将列表拆分为重复列表和非重复列表