我从Enumerable.Select中找到了哪种显式类型

时间:2012-11-12 16:43:58

标签: c# linq

我有来自Microsoft的以下代码示例(http://msdn.microsoft.com/en-us/library/bb534869.aspx):

String[] fruits = {"apple", "banana", "mango", "orange", "passionfruit", "grape" };
var query = fruits.Select((fruit, index) 
  => new {Substring = fruit.Substring(0, index)});

foreach (var obj in query)
  Console.WriteLine("{0}", obj);

这很有效,但我不明白的是什么类型的查询?

我试图从调试器中获取信息,但我无法声明它并明确地将其写下来。我尝试了几种变体,例如

IEnumerable<int,string> query = fruits.Select((fruit, index) 
  => new {Substring = fruit.Substring(0, index)});

但这确实构建了。如何在不使用var?

的情况下显式定义查询类型

3 个答案:

答案 0 :(得分:7)

您无法指定类型,因为它是anonymous。在这里阅读更多: http://msdn.microsoft.com/en-us/library/bb397696.aspx

答案 1 :(得分:2)

当您使用没有特定类型的new运算符时,编译器会创建一个您无法显式引用的匿名类型。如果您希望能够引用它,那么您应该创建自己的类以显式返回,或者返回预先存在的类。尝试:

IEnumerable<string> query = fruits.Select((fruit, index) => fruit.Substring(0, index));

答案 2 :(得分:1)

为了完整性,如果你真的必须指定类型(并且确实没有必要 - 匿名类型就像类型安全一样)那么你必须首先声明一个类/ struct < / p>

public class FruitySubstringyThingy
{
    public string Substring{get;set;}
}

并在投影

中使用它
IEnumerable<FruitySubstringyThingy> items
  = fruits.Select((fruit,index) => new FruitySubstringyThingy{Substring = fruit.Substring(0, index)});