将通用列表值复制到另一个通用列表

时间:2012-07-11 05:24:03

标签: c# asp.net cultureinfo generic-list

我有这个网络方法。

   [WebMethod]
    public List<BlogCultureInfo> loadCultureList()
    {
        List<Language> lstAllCultures = LocaleController.GetCultures();//Its bring a value from cultureInfo
        List<SCultureInfo> lstCulture = new List<SCultureInfo>();
        SCultureInfo objInfo = new SCultureInfo();
        foreach (Language objLst in lstAllCultures)
        {

            objInfo.LanguageName = objLst.LanguageName;
            objInfo.LanguageCode = objLst.LanguageCode;

            lstCulture.Add(objInfo);
        }
        return lstCulture;

    }

它的运行没有任何错误。当我在lstAllCultures中调试它带来正确的值.1010不同的cultureinfo值。但是当我看到lstCulture后它的最后一个值lstAllCulturesenter image description here

我做错了什么。谢谢。

4 个答案:

答案 0 :(得分:4)

您需要在循环内创建新对象(SCultureInfo),而不是在外部。

foreach (Language objLst in lstAllCultures)
        {
            SCultureInfo objInfo = new SCultureInfo();
            objInfo.LanguageName = objLst.LanguageName;
            objInfo.LanguageCode = objLst.LanguageCode;
            lstCulture.Add(objInfo);
        } 

在原始代码中,您只有一个对象,在列表中多次添加并保存在foreach循环的最后一次迭代中指定的值。

答案 1 :(得分:0)

将其更改为:

foreach (Language objLst in lstAllCultures)
  {
  SCultureInfo objInfo = new SCultureInfo();
  objInfo.LanguageName = objLst.LanguageName;
  objInfo.LanguageCode = objLst.LanguageCode;
  lstCulture.Add(objInfo);
}

答案 2 :(得分:0)

因为你在foreach循环之外实例化objInfo,并且通过在列表中添加对象,你只是添加对象的REFERENCE,然后对foreach循环中对象的任何修改都将应用于列表。

如何移动线

 SCultureInfo objInfo = new SCultureInfo();

在foreach循环中

  foreach (Language objLst in lstAllCultures)

它是否有效?

答案 3 :(得分:0)

您要为每个objInfo添加相同的lstAllCultures实例到列表中。看起来LanguageNameLanguageCode是引用类型。因此,每次为objInfo分配新值时,它都会使用值更新实例,并且多次添加时,您会看到重复的值相同。

要解决此问题,请每次在foreach中创建一个新的objInfo,如

foreach (Language objLst in lstAllCultures)
{
    SCultureInfo objInfo = new SCultureInfo();
    objInfo.LanguageName = objLst.LanguageName;
    objInfo.LanguageCode = objLst.LanguageCode;
    lstCulture.Add(objInfo);
}