C# 无法在linq查询后将类型System.Collections.Generic.List隐式转换回对象

C# 无法在linq查询后将类型System.Collections.Generic.List隐式转换回对象,c#,asp.net,linq,arraylist,collections,C#,Asp.net,Linq,Arraylist,Collections,我有一个Address类和一个名为AddressCollection“objaAddresses”的地址集合 namespace MemberModel { [Serializable()] public class Address { public int MemberID { get; set; } public string MemberStreet { get; set; } public string Mem

我有一个Address类和一个名为AddressCollection“objaAddresses”的地址集合

namespace MemberModel
{
    [Serializable()]
    public class Address 
    {
        public int MemberID { get; set; }

        public string MemberStreet { get; set; }

        public string MemberCity { get; set; }

        public string MemberState { get; set; }

        public string MemberZipcode { get; set; }
    }
}

using System.Collections.Generic;
namespace MemberModel
{
    [System.Serializable()]
    public class AddressCollection : System.Collections.ObjectModel.Collection<Address>
    {
    }
}
这样我就能从1000个地址中得到40个

问题是现在我需要将这个objSearch转换回AddressCollection对象objAddresses。我得到这个错误 无法隐式转换类型

无法将System.Collections.Generic.List类型隐式转换为 MemberModel.AddressCollection

集合
具有接受IList的构造函数。将相应的构造函数添加到
AddressCollection
类并调用基构造函数

public class AddressCollection : System.Collections.ObjectModel.Collection<Address>
{
    public AddressCollection(IList<Address> addresses)
        : base(addresses)
    {
    }

    public AddressCollection()
    {
    }
}
见:


    • 另一种简单的方法。我还猜测参数是
      IList
      。如果没有,请尝试
      System.Collections.ObjectModel.Collection

          public AddressCollection GetAddressList(IList<Address> addresses)
          {
              MemberModel.AddressCollection objAddresses = new MemberModel.AddressCollection();
              foreach (var item in addresses)
              {
                  objAddresses.Add(item);
              }
      
              return objAddresses;
          }
      
      公共地址集合GetAddressList(IList地址) { MemberModel.AddressCollection OBJAAddresses=新的MemberModel.AddressCollection(); foreach(地址中的变量项) { objaddress.Add(项目); } 返回objaddress; } 您正在声明:

      MemberModel.AddressCollection objAddresses = new MemberModel.AddressCollection();
      
      声明的
      objaddress
      类型为
      AddressCollection
      。C#是静态类型的。一旦声明了具有给定类型的变量,就不能为其分配任何非该类型的变量

      这就是为什么这里会出现编译错误:

      var objSearch = from searchAddresses in objAddresses
          .WheresearchAddresses => searchAddresses.MemberZipcode.Contains("1173"))
          select searchAddresses;
      
      objAddresses = objSearch.ToList(); // compile error
      
      objSearch
      是一个
      IEnumerable

      调用
      .ToList()
      会得到一个
      列表
      。不能将
      列表
      分配给声明为type
      AddressCollection
      的变量。只能将
      AddressCollection
      或从中继承的内容分配给该变量

      您可以这样做:

      objAddresses = new MemberModel.AddressCollection(objSearch.ToList());
      
      现在您正在创建一个新的
      AddressCollection
      实例,其中包含
      列表中的所有项。然后将正确类型的对象分配给变量-
      AddressCollection


      作为补充,当您最初声明变量时,您正在分配一个新集合,但从未使用它。你只是在以后用一个新的系列来替换它

      您可以消除以下情况:

      MemberModel.AddressCollection objAddresses = new MemberModel.AddressCollection ();
      
      然后在分配变量的位置声明变量:

      var objAddresses = new MemberModel.AddressCollection(objSearch.ToList());
      


      最后,匈牙利符号已经过时了。变量名上不需要
      obj
      前缀。人们会觉得很有趣。您只需调用变量
      addresses

      通常,如果您有一个集合,并且需要转换为另一种类型,您可以使用循环将集合中的元素添加到所需类型的新实例化对象中。但是,如果没有更多的代码,很难复制您拥有的内容。@David Bentley我在vb.net中使用了相同的代码,它工作得非常完美。但C#在这种转换上存在问题。我必须能够强制转换它或其他东西,而不必在这些linq查询中的每一个上都设置一个循环,这将是如此单调,您只需创建一个转换方法或扩展
      AddressCollection
      可以执行的操作,如下所示。它没有多少额外的代码。Olivier Jacot Descombes的回答很优雅,但我也会为您发布我的选择。您的搜索代码没有编译。您正在混合LINQ查询语法和扩展方法语法,并且缺少左大括号。此外,我没有看到将
      objSearch
      转换回
      AddressCollection
      的部分,我没有找到将
      System.Collections.Generic.List
      转换为
      MemberModel.AddressCollection
      的代码。请张贴错误的代码。
      objAddresses = new MemberModel.AddressCollection(objSearch.ToList());
      
      MemberModel.AddressCollection objAddresses = new MemberModel.AddressCollection ();
      
      var objAddresses = new MemberModel.AddressCollection(objSearch.ToList());