【问题标题】:IEnumerable or var [duplicate]IEnumerable 或 var [重复]
【发布时间】:2011-10-26 19:16:57
【问题描述】:

可能重复:
C# 'var' vs specific type performance

在性能方面,在 linq 中使用 var 或 IEnumerable 有什么不同吗? IEnumerable 或 IQueryable 呢?我们如何知道哪一个是 IEnumerable,哪一个是 IQueryable? 例如:在下面的代码中

 IEnumerable<CaseTable> test = from x in dataBase.CaseTables
                               where x.case_id.Equals("12")
                               select x;

【问题讨论】:

  • 没有。预计它已经在这里讨论了很多次:stackoverflow.com/questions/41479/use-of-var-keyword-in-c。在你的情况下,你有IEnumerable&lt;CaseTable&gt;,只要Select返回IEnumerable&lt;T&gt;
  • @zerkms 这个问题没有问任何关于性能的问题。
  • @Mr.失望:我懒得找,但这里是:stackoverflow.com/questions/356846/… ;-)
  • @zerkms 确实可以 - 请参阅我添加的示例
  • @Marc Gravell:是的,已经这样做了,并且 +1 了你。虽然我从来没有经历过(显然这就是我提到“不”的原因)甚至更多 - 这对我来说似乎是一个很大的惊喜

标签: c# linq


【解决方案1】:

var 只是程序员的语法 - 它根本不会改变语义。如果您声明为var,则在您的示例中测试类型仍为IEnumerable&lt;CaseTable&gt;

至于是 IEnumerable 还是 IQueryable - 这取决于 dataBase.CaseTables 的类型

【讨论】:

  • 实际上,在示例中我想 var 会使用 IQueryable-of-T
  • @Marc 你能告诉我你是怎么想出这个想法的吗?我无法理解 IQueryable 和 IEnumerable 之间的区别。即使在 msdn.microsoft.com 中,大多数示例都使用 var。
  • @Daniel IEnumerable 使用 LINQ-to-Objects。为了使用组合接口,必须使用更强的 IQueryable 接口。这有创建组合查询的 Count、Where 等的不同实现,而不是菊花链对象方法
  • @Daniel 基本上,归结为使用 Enumerable.{method} 还是 Queryable.{method}
【解决方案2】:

如果返回类型不同,它会有所不同,然后会改变组合。例如:

IEnumerable<Users> users = db.Users;
var count = users.Count();

对比:

var users = db.Users;
var count = users.Count();

如果这实际上是一个数据库提供程序,则第二个应发出“从用户中选择 COUNT(1)”(1 行,1 列)-但是,第一个将发出“从用户中选择 *”-n 列次m 行。它将通过网络拖动数据,将其具体化为对象,然后(LINQ-to-Objects)对对象进行计数。

如果它是已经 IEnumerable&lt;T&gt; 那么它不会有任何区别。

重新知道它是什么 - 悬停;)或更好:使用分析器(例如 mvc-mini-profiler),以便您可以随时密切关注它正在运行的查询。

【讨论】:

    【解决方案3】:

    使用var而不是IEnumerable&lt;T&gt;可以在右侧表达式的类型不是IEnumerable&lt;T&gt;的情况下产生性能差异。

    在您上面的代码中(假设 dataBase.CaseTables 是由 LINQ to SQL 或其他类似提供程序支持的 IQueryable&lt;CaseTable&gt;),如果您编写了 test.First(),您可以从数据库中检索大量行以仅获取第一行。

    如果您使用varIQueryable&lt;CaseTable&gt;,您将只检索第一行。

    即使没有IQueryable&lt;T&gt;,这也会有所作为。例如,List&lt;T&gt;.GetEnumerator() 返回自定义 struct。使用它进行迭代将比通过IEnumerator&lt;T&gt; 迭代更快。尽管大多数情况下差异可以忽略不计。

    这一切意味着什么:是的,使用var 可以产生影响:它可以使您的代码更快,在某些情况下快得多

    【讨论】:

    • 我想我仍然对 IQueryable 和 IEnumerable 感到困惑。如何区分它们?
    • 我不确定我是否理解,但我认为IEnumerable&lt;T&gt;IQueryable&lt;T&gt; 之间的区别超出了您最初问题的范围,并且其他人已经比我更好地解释了它们。只需使用谷歌搜索它们。
    【解决方案4】:

    关键字“var”只是 C# 中的语法糖。那声明的变量还是静态类型的,编译器会推断它的类型。

    Type obj = new Type() and var obj = new Type() are the same.
    

    当变量的类型从其声明中显而易见时,"var" 有助于使您的代码不那么臃肿。当您想发现不那么明显的变量类型(通过 IntelliSense)时,它也非常好——“LINQ”敲响了一些钟声。

    当然,限制适用于您何时可以使用“var”。看看here

    【讨论】:

      猜你喜欢
      • 2011-05-02
      • 1970-01-01
      • 2019-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多