我不确定我是否完全理解以下示例的工作原理。它来自 C#4.0 in Nutshell 。
class Program
{
static void Main(string[] args)
{
string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };
IEnumerable<TempProjectionItem> temp =
from n in names
select new TempProjectionItem
{
Original = n,
Vowelless = n.Replace("a", "").Replace("e", "").Replace("i", "")
.Replace("o", "").Replace("u", "")
};
IEnumerable<string> query = from item in temp
where item.Vowelless.Length > 2
select item.Original;
foreach (string item in query)
{
Console.WriteLine(item);
}
}
class TempProjectionItem
{
public string Original;
public string Vowelless;
}
}
IEnumerable
是一个界面,不是吗? temp
和query
是什么类型的对象?为什么TempProjectionItem
不需要实施IEnumerable
?
答案 0 :(得分:3)
TempProjectionItem
是序列的元素类型...就像IEnumerable<int>
(例如List<int>
)是{{1}的序列一样没有int
本身实现int
的值。
请注意,有两个序列接口:IEnumerable
和System.Collections.IEnumerable
。显然,后者是通用的,代表特定类型的序列。因此System.Collections.Generic.IEnumerable<T>
是一系列temp
元素,TempProjectionItem
是一系列query
元素。
这些都不是真正的集合 - 查询是懒惰地执行的 - 当你迭代数据时,它只被评估(从string
开始)。迭代names
涉及迭代query
,然后迭代temp
。
答案 1 :(得分:0)
IEnumerable is an interface, isn't it?
是的,确实如此。实际上,在您的代码中,您使用的是IEnumerable<T>
,它是一个通用接口。
What kind of object is temp and query?
在您的代码中,我们可以看到temp的类型为IEnumerable<TempProjectionItem>
,而查询为IEnumerable<string>
,两者都来自IEnumerable<T>
。
Why does TempProjectionItem not need to implement IEnumerable?
TempProjectionItem不是IEnumerable,它只是IEnumerable<TempProjectionItem>
的一个项目,它是一个“容器”。