2

我正在执行以下请求。它按预期工作并返回结构正确的数据。(它创建一个“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. 如何显式声明类型?

我尝试了不同的声明变体,失败了。

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

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

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

5 回答 5

0

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

select Tuple.Create(
    B.Key,
    (from A in As where A.F == B.Key select A).ToList()
)
于 2013-01-16T12:58:58.983 回答
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
    };
于 2013-01-16T13:02:58.320 回答
0

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

于 2013-01-16T13:03:07.820 回答
0

您不能显式声明类型,因为通过说

select new {
   Member = Value
}

您正在使用匿名类型- 此类类型具有无法说出的名称,因此这是您必须使用的情况之一var

于 2013-01-16T13:04:11.307 回答
0

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

如果您将鼠标悬停var在 Visual Studio 中的关键字上,它将告诉您它是什么类型(因为在编译时必须知道它,除非它是 a 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 的建议使用a 。

于 2013-01-16T13:07:02.697 回答