【问题标题】:Copy generic list value to another generic list将通用列表值复制到另一个通用列表
【发布时间】:2012-07-11 05:24:02
【问题描述】:

我有这个网络方法。

   [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 中调试时,它会带来正确的值。210 个不同的cultureinfo 值。但是在循环之后,当我看到lstCulture 时,它的最后一个值是lstAllCultures.

我做错了什么。谢谢。

【问题讨论】:

  • SCultureInfo objInfo = new SCultureInfo(); //将其移入循环

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    改成:

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

    【讨论】:

      【解决方案3】:

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

      如何移动线

       SCultureInfo objInfo = new SCultureInfo();
      

      在foreach循环中

        foreach (Language objLst in lstAllCultures)
      

      它能达到目的吗?

      【讨论】:

        【解决方案4】:

        您正在将相同的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);
        } 
        

        【讨论】:

          猜你喜欢
          • 2021-06-08
          • 1970-01-01
          • 1970-01-01
          • 2019-05-23
          • 2017-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-25
          相关资源
          最近更新 更多