返回包含相同Object的List

时间:2013-07-13 03:49:09

标签: c# asp.net web-services

我正在使用ASP.net Web Service C#.net3.5并使用LINQ TO SQL来操作SQL DataBase

我希望从Countries表中返回所有国家/地区的信息, 所以我写了一个返回一个对象List的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;

}

但是当我运行代码时,我得到一个包含相同Object的List,并且该对象具有从最后一轮Foreach获取的值。

我尝试以下内容:

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;

}

我得到了我想要的&gt;&gt;为什么????

2 个答案:

答案 0 :(得分:3)

这两个循环做了很多不同的事情:

  1. 在第一个示例中,您只创建一个对象/然后每次循环,修改同一个对象,然后将其重新添加到列表中。因此,您的列表包含一堆对同一对象的引用,一遍又一遍。

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

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

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

  3. 进一步阅读

答案 1 :(得分:2)

您的第一个代码段仅创建一个您多次放入列表的对象。第二个在foreach循环的每次迭代中创建一个。

另一方面,我建议您将CountryObject更改为IdName属性,并且您不需要在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();
}