C# 无法在linq查询后将类型System.Collections.Generic.List隐式转换回对象
我有一个Address类和一个名为AddressCollection“objaAddresses”的地址集合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
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()
会得到一个列表
。不能将列表
分配给声明为typeAddressCollection
的变量。只能将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());