返回包含相同对象的列表
本文关键字:列表 对象 包含相 返回 | 更新日期: 2023-09-27 18:22:14
我正在使用ASP.net Web Service C#.net3.5,并使用LINQ TO SQL与SQL数据库进行操作
并且我想要返回CCD_ 1表中的所有国家信息,所以我写了一个返回对象列表的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;
}
但当我运行代码时,我会得到一个包含相同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;
}
我得到了我想要的>>什么????
这两个循环做的事情非常不同:
-
在第一个例子中,您只创建了一个对象/然后每次通过循环,修改同一个对象,然后将其重新添加到列表中。所以你的列表包含了一堆对同一对象的引用,一遍又一遍。
这是因为
CountryObject
和所有类一样都是引用类型。当您将实例添加到TempList
时,您只是添加了对该实例的引用,而不是它的副本,因此当您稍后修改实例时,这些更改将反映在列表中,因为它只有对同一实例的引用。 -
在第二个示例中,在每次迭代中创建一个新对象,并将新创建的对象添加到循环中。
因为每次都要创建一个新实例,所以列表引用的实例不会被修改。
进一步阅读
- 值类型和引用类型
您的第一个代码片段只创建了一个多次放入列表的对象。第二个创建foreach
循环的每次迭代一个。
另一方面,我建议将CountryObject
更改为具有Id
和Name
属性,并且不需要在Countries
0查询中使用匿名类。属性比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();
}