返回一个包含相同的对象

问题描述:

我与ASP.net Web服务C#.NET3.5的工作,并使用LINQ to SQL中使用SQL数据库返回一个包含相同的对象

操纵名单,我想返回所有的国家信息从Countries表, 所以我写了一个Web方法返回对象的列表,每个对象有两个数据字段Country_IdCountry_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; 

} 

,我得到了我想要什么>>为什么????

两个循环做完全不同的事情:

  1. 在第一个例子,你只能通过一个对象/那么每次创建,修改同一个对象,然后将其重新添加到列表。所以你的列表一次又一次地包含了一堆对同一个对象的引用。

    这是因为CountryObject,像所有的类是引用类型。将实例添加到TempList时,您只是添加对该实例的引用,而不是它的副本,因此当您稍后修改实例时,这些更改将反映在列表中,因为它只引用相同的实例。

  2. 在第二个示例中,在每次迭代中创建一个新对象,并将该新创建的对象添加到循环中。

    因为您每次都创建一个新实例,所以列表引用的实例不会被修改。

进一步阅读

你的第一个代码段仅创建一个你投入列表多次一个对象。第二个循环创建一个迭代循环。

在另一方面,我建议改变CountryObjectIdName特性,你就不需要在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(); 
}