返回包含相同对象的列表

本文关键字:列表 对象 包含相 返回 | 更新日期: 2023-09-27 18:22:14

我正在使用ASP.net Web Service C#.net3.5,并使用LINQ TO SQL与SQL数据库进行操作

并且我想要返回CCD_ 1表中的所有国家信息,所以我写了一个返回对象列表的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;
}

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

返回包含相同对象的列表

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

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

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

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

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

进一步阅读

  • 值类型和引用类型

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

另一方面,我建议将CountryObject更改为具有IdName属性,并且不需要在Countries0查询中使用匿名类。属性比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();
}