1

我正在使用 ASP.net Web Service 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;

}

但是当我运行代码时,我得到一个包含相同对象的列表,并且该对象具有从上一轮 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;

}

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

4

2 回答 2

3

这两个循环做了非常不同的事情:

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

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

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

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

延伸阅读

于 2013-07-13T03:55:22.050 回答
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();
}
于 2013-07-13T03:58:05.980 回答