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

时间:2013-01-16 12:55:32

标签: c# linq

我正在做以下请求。它可以正常工作并返回正确的结构数据。 (它创建一个带有“head”的元素,对应于公共字段,并将该字段中相同值的所有元素作为“尾部”中的数组放置。)

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. 如何明确声明类型?
  3. 我尝试了不同的声明变体,作为但是失败了。

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

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

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

5 个答案:

答案 0 :(得分:0)

生成的可枚举序列的类型由select子句后面的表达式类型决定,所以:

select Tuple.Create(
    B.Key,
    (from A in As where A.F == B.Key select A).ToList()
)

答案 1 :(得分:0)

首先是

Tuple<String, IEnumerable<MyType>> <=> Tuple<String, MyType>,但问题不在这里,你不能将匿名类型转换为Tuple。您必须明确定义类型然后使用它。

public class YourClass
{
    public string F1 {get; set;}
    public IEnumerable<MyType> F2 {get; set;}
} 

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

答案 2 :(得分:0)

由于您使用select new {...}创建匿名类型,因此必须使用var。无法明确表达类型。

答案 3 :(得分:0)

您无法明确声明类型,因为可以说

select new {
   Member = Value
}

您使用的是匿名类型 - 此类型名称具有难以形容的名称,因此这是必须使用var的情况之一。

答案 4 :(得分:0)

虽然您知道对象“insides”是相同的,但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);

或使用Tuple作为Jon建议的 here