返回一个包含相同的对象
问题描述:
我与ASP.net Web服务C#.NET3.5的工作,并使用LINQ to SQL中使用SQL数据库返回一个包含相同的对象
操纵名单,我想返回所有的国家信息从Countries
表, 所以我写了一个Web方法返回对象的列表,每个对象有两个数据字段Country_Id
,Country_Name
这里是方法:
public List<CountryObject> ReturnAllCountries()
{
ProjectTwoDataBaseDataContext DataBase = new ProjectTwoDataBaseDataContext();
var Country = from a in DataBase.Countries
select new {a.Country_Id,a.Country_Name };
CountryObject TempObject = new CountryObject();
List<CountryObject> TempList = new List<CountryObject>();
foreach (var a in Country)
{
TempObject.setCountry_Id(a.Country_Id);
TempObject.setCountry_Name(a.Country_Name);
TempList.Add(TempObject);
}
return TempList;
}
但是当我运行的代码,我得到一个List包含相同的对象,并且这个对象具有从上一轮Fo获得的值达到。
我尝试以下方法:
public List<CountryObject> ReturnAllCountries()
{
ProjectTwoDataBaseDataContext DataBase = new ProjectTwoDataBaseDataContext();
var Country = from a in DataBase.Countries
select new {a.Country_Id,a.Country_Name };
CountryObject TempObject;
List<CountryObject> TempList = new List<CountryObject>();
foreach (var a in Country)
{
TempObject = new CountryObject();
TempObject.setCountry_Id(a.Country_Id);
TempObject.setCountry_Name(a.Country_Name);
TempList.Add(TempObject);
}
return TempList;
}
,我得到了我想要什么>>为什么????
答
两个循环做完全不同的事情:
-
在第一个例子,你只能通过一个对象/那么每次创建,修改同一个对象,然后将其重新添加到列表。所以你的列表一次又一次地包含了一堆对同一个对象的引用。
这是因为
CountryObject
,像所有的类是引用类型。将实例添加到TempList
时,您只是添加对该实例的引用,而不是它的副本,因此当您稍后修改实例时,这些更改将反映在列表中,因为它只引用相同的实例。 -
在第二个示例中,在每次迭代中创建一个新对象,并将该新创建的对象添加到循环中。
因为您每次都创建一个新实例,所以列表引用的实例不会被修改。
进一步阅读
答
你的第一个代码段仅创建一个你投入列表多次一个对象。第二个循环创建一个迭代循环。
在另一方面,我建议改变CountryObject
有Id
和Name
特性,你就不需要在Linq
查询使用匿名类。属性优于get和set方法。
public class CountryObject
{
public int Id { get; set; }
public string Name { get; set; }
}
public List<CountryObject> ReturnAllCountries()
{
ProjectTwoDataBaseDataContext DataBase = new ProjectTwoDataBaseDataContext();
var Country = from a in DataBase.Countries
select new CountryObject{Id=a.Country_Id, Name=a.Country_Name };
return Coutry.ToList();
}