1

ASP.net Web サービス C#.net3.5 を使用しており、LINQ TO SQL を使用して SQL データベースを操作しています

テーブルからすべての国情報を返したいCountries ので、オブジェクトのリストを返す Web メソッドを作成しました。各オブジェクトには 2 つのデータ フィールド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

2 つのループは非常に異なることを行います。

  1. 最初の例では、オブジェクトを 1 つだけ作成しています。次に、ループを実行するたびに、同じオブジェクトを変更してから、リストに再度追加します。したがって、リストには同じオブジェクトへの参照が何度も何度も含まれています。

    これCountryObjectは、すべてのクラスと同様に参照型であるために発生します。インスタンスを追加すると、インスタンスTempListのコピーではなく、そのインスタンスへの参照のみが追加されるため、後でインスタンスを変更すると、同じインスタンスへの参照しかないため、それらの変更がリストに反映されます。

  2. 2 番目の例では、反復ごとに新しいオブジェクトを作成し、その新しく作成されたオブジェクトをループに追加します。

    毎回新しいインスタンスを作成しているため、リストが参照するインスタンスは変更されていません。

参考文献

于 2013-07-13T03:55:22.050 に答える
2

最初のコード スニペットは、リストに複数回追加したオブジェクトを 1 つだけ作成します。foreach2 番目は、ループの繰り返しごとに 1 つ作成します。

別の注意として、プロパティCountryObjectを持っているように変更することをお勧めします。クエリで匿名クラスを使用する必要はありません。プロパティは、get および set メソッドよりも優先されます。IdNameLinq

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 に答える