我不确定我是否完全理解以下示例的工作方式。简而言之,它来自C#4.0。
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
? 最佳答案
TempProjectionItem
是序列的元素类型...就像IEnumerable<int>
(例如List<int>
)是int
值的序列,而int
本身未实现IEnumerable
一样。
请注意,有两个序列接口:System.Collections.IEnumerable
和System.Collections.Generic.IEnumerable<T>
。显然,后者是通用的,代表特定类型的序列。所以temp
是TempProjectionItem
元素的序列,而query
是string
元素的序列。
这些都不是真正的集合-查询是延迟执行的-仅当您遍历数据时才对它进行评估(以names
开头)。在query
上进行迭代涉及在temp
上进行迭代,然后在names
上进行迭代。