【问题标题】:Why I can't access to the Count property after a .ToList()为什么在 .ToList() 之后我无法访问 Count 属性
【发布时间】:2012-07-20 12:54:29
【问题描述】:

我有这个代码:

var numbers = new []{ 1,2,3 };
IEnumerable<int> evenNumbers = numbers.Where(i=> i % 2 == 0);

现在我把这个“集合”变成一个列表:

evenNumbers = evenNumbers.ToList();

为什么现在我只能evenNumbers.Count() 而不能evenNumbers.Count

与:

IList<int> evenNumbers = numbers.Where(i=> i % 2 == 0).ToList();

我可以。不会'evenNumbers = evenNumbers.ToList(); 将 IEnumerable 实现为列表?

【问题讨论】:

    标签: linq list ienumerable


    【解决方案1】:

    对于您的编译器,evenNumbers 仍然是 IEnumerable 类型。您的编译器不知道它实际上是一个列表。如果将派生类型的对象分配给变量,则变量“evenNumbers”的类型不会改变。

    【讨论】:

    • 所以,它变成了一个列表,但我不能将它用作一个列表? :O
    • @markzzz 举个极端的例子:object o = evenNumbers.ToList();你认为你能做到o.Counto.Count() 吗?不,因为 C# 编译器不知道 o 对象中的内容,而 C# 是静态链接的(忽略 C# 4.0 dynamic 对象)
    • 说“运行时的一种演员表”是否正确?哈哈。你有关于这种行为的教程吗?
    • @markzzz 这是标准的面向对象行为。如果您还不完全熟悉 OOP 的原理,我建议您阅读一本关于该主题的介绍性书籍作为教程。 Head First(来自 O'Reilly)有一些优秀的书籍和优秀的例子。这些书读起来(有点像)像一本漫画书,所以它永远不会成为沉重的文学作品。
    【解决方案2】:

    evenNumbers 变量在赋值后仍然是IEnumerable&lt;int&gt;。您应该创建一个新的变量类型IList&lt;int&gt;List&lt;int&gt; 来使用Count 属性,因为它是在IList&lt;T&gt; 接口中定义的。这就是你在第二次作业中所做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 2017-12-03
      • 2022-10-14
      • 1970-01-01
      相关资源
      最近更新 更多