【问题标题】:Is it possible to Union starting from an empty var?是否可以从空变量开始联合?
【发布时间】:2013-03-06 14:20:34
【问题描述】:

我需要类似的东西:

var myList;

foreach (MyObject myObject in myObjects)
{
    myList = myList.Union(myObject.Items.Cast<Item>());
}

但似乎我无法初始化一个空变量。解决方案?

【问题讨论】:

    标签: c# .net linq union var


    【解决方案1】:

    var 不是这样工作的,它使用类型推断来根据等号之后的内容分配类型。

    此外,当您尝试访问myList 初始化它之前(它会是null),这会引发空异常。试试这个:

    IEnumerable<Item> myList = myObjects.SelectMany(m => m.Items.Cast<Item>());
    

    【讨论】:

    • 我不会将其描述为“惰性求值”——它是类型推断。
    • 不错!也适用于var myList = myObjects.SelectMany(m =&gt; m.Items.Cast&lt;Item&gt;());
    • @markzzz 是的,你可以保留var,只要你先给它分配一些东西:)
    【解决方案2】:

    Union 返回相同的类型,考虑到您在其中使用IEnumerable&lt;Item&gt;,那么:

    var myList = Enumerable.Empty<Item>();
    

    【讨论】:

      【解决方案3】:

      这不是 Union 的问题 - 这是尝试从 任何 未初始化的局部变量中读取的问题。

      你可以使用:

      var myVar = Enumerable.Empty<Item>();
      

      ... 或者只使用 SelectMany,如 mattytommo 所示,可能通过调用 Distinct() 来获取不同的元素(就像 Union 那样)。

      【讨论】:

        【解决方案4】:

        你必须指定变量的类型,并且你必须从一个空集合开始,例如:

        IEnumerable<Item> myList = new List<Item>();
        

        【讨论】:

          【解决方案5】:

          编译器不知道你要创建哪种类型所以

          var myList;
          

          不足以告诉编译器myList 有什么类型。 你可以这样做

          List<Item> myList;
          

          但是对.Union 的调用会给你一个 NullReferenceException。

          那么为什么不从一个空列表开始

          List<Item> myList = new List<Item>
          

          还是一个 IEnumerable?

          IEnumerable<Item> myEnumerable = Enumerable.Empty<Item>()
          

          【讨论】:

            猜你喜欢
            • 2022-08-09
            • 2020-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-17
            • 2017-01-03
            • 2019-07-04
            • 2018-02-20
            相关资源
            最近更新 更多