1

我有以下来自 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 的情况下显式定义查询类型?

4

3 回答 3

7

您不能指定类型,因为它是anonymous. 在此处阅读更多信息:http: //msdn.microsoft.com/en-us/library/bb397696.aspx

于 2012-11-12T16:46:33.957 回答
2

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

IEnumerable<string> query = fruits.Select((fruit, index) => fruit.Substring(0, index));
于 2012-11-12T16:50:29.277 回答
1

只是为了完整起见,如果您真的必须指定类型(并且确实没有必要 - 匿名类型同样是类型安全的),那么您必须首先声明一个类/结构

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

并在投影中使用它

IEnumerable<FruitySubstringyThingy> items
  = fruits.Select((fruit,index) => new FruitySubstringyThingy{Substring = fruit.Substring(0, index)});
于 2012-11-12T16:52:31.170 回答