C#LINQ / Object Initializers Nutshell中C#4.0的示例

时间:2010-08-13 05:18:28

标签: c# linq interface

我不确定我是否完全理解以下示例的工作原理。它来自 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是一个界面,不是吗? tempquery是什么类型的对象?为什么TempProjectionItem不需要实施IEnumerable

2 个答案:

答案 0 :(得分:3)

TempProjectionItem是序列的元素类型...就像IEnumerable<int>(例如List<int>)是{{1}的序列一样没有int本身实现int的值。

请注意,有两个序列接口:IEnumerableSystem.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>的一个项目,它是一个“容器”。