【问题标题】:Custom object not storing all names [closed]自定义对象不存储所有名称[关闭]
【发布时间】:2015-08-28 19:28:27
【问题描述】:

我的gymInfo 课程中有这段代码:

public class gymInfo
{
   public gymArray getAllGymsByStars()
   {
        gymDataTableAdapters.gymsTableAdapter gymsTableAdapter = new gymDataTableAdapters.gymsTableAdapter();
        DataTable gymsDataTable = gymsTableAdapter.getAllGymsByStars();
        gymArray gymArray = new gymArray();

        foreach(DataRow row in gymsDataTable.Rows)
        {
            gymArray.name = row["name"].ToString();        
        }
        return gymArray;
    }
}

gymsDataTable包含20行名字,现在我做了一个自定义类,代码如下:

public class gymArray
{
  public string name { get; set; }
}

我希望 string name 填充 20 个名称(因为它们在数据表中是 20 行)但是当我在线调试 return gymArray 它只显示最后一行的名称而不是显示整个自定义名称数组。

有人明白我做错了什么吗?

【问题讨论】:

  • 您希望如何将数组存储在单个变量中。
  • gymArray 只是一个字符串值,而不是一个实际的字符串数组。
  • 你调用的类gymArray绝不是一个数组
  • gymArray 只是一个对象,简单来说它不是列表或数组,它不是可枚举的。
  • 我建议在类级别 public static nameList = new List<string> 创建类似的内容,然后使用 List<T>.Add() 方法将其填充到你的 foreach 循环中,或者创建一个 List<gymArray>

标签: c# asp.net arrays custom-object


【解决方案1】:

你实际上并没有创建一个数组。您只有一个 gymArray 对象,而您只是反复更改其 name 属性。

另外,你在命名事物时没有关注C# conventions。你的代码应该更像这样:

public class GymInfo
{
   public List<Gym> GetAllGymsByStars()
   {
        gymDataTableAdapters.gymsTableAdapter gymsTableAdapter = new gymDataTableAdapters.gymsTableAdapter();
        DataTable gymsDataTable = gymsTableAdapter.getAllGymsByStars();    
        List<Gym> gyms = new List<Gym>();    
        foreach(DataRow row in gymsDataTable.Rows)
        {
            Gym gym = new Gym();
            gym.Name = row["name"].ToString();
            gyms.Add(gym);      
        }
        return gyms;
    }
}

public class Gym
{
     public string Name { get; set; }
}

我没有将单个对象命名为“数组”,而是创建了一个通用的 Gym 对象列表并从 GetAllGymsByStars 方法返回。

【讨论】:

    【解决方案2】:
    public class gymArray
    {
      public List<string> names { get; set; }
    }
    
    public gymArray getAllGymsByStars()
    {
      gymDataTableAdapters.gymsTableAdapter gymsTableAdapter = new gymDataTableAdapters.gymsTableAdapter();
      DataTable gymsDataTable = gymsTableAdapter.getAllGymsByStars();
      gymArray gymArray = new gymArray();
      gymArray.names = new List<string>();
    
      foreach(DataRow row in gymsDataTable.Rows)
      {
         gymArray.names.Add(row["name"].ToString());        
      }
      return gymArray;
    }
    

    【讨论】:

      【解决方案3】:

      我不知道您每次在 foreach 循环中覆盖 name 属性时如何存储所有名称

      循环只是为你做一些事情,比如:

      gymArray.name = "some name";
      gymArray.name = "other name";
      

      我猜你完全知道name 的最后一个值是other name。您可以使用+ 运算符附加到最后一个值,这将产生一大串名称,或者将name 属性更改为某个集合并添加新名称。也许string 不是你喜欢的类型。

      【讨论】:

        【解决方案4】:

        我认为你应该实现为

        List&lt;gymArray&gt; gymArray = new List&lt;gymArray&gt;();

        在循环中。

        gymArray.Add(new gymAray { name : row["name"].ToString() });

        【讨论】:

          【解决方案5】:

          嗯,你一次又一次地设置同一个对象的属性。

          试试这个

          public class gymInfo
          {
             public gymArray[] getAllGymsByStars()
             {
                 int count = 0;
                  gymDataTableAdapters.gymsTableAdapter gymsTableAdapter = new gymDataTableAdapters.gymsTableAdapter();
                  DataTable gymsDataTable = gymsTableAdapter.getAllGymsByStars();
                  gymArray[] gymArray = new gymArray[gymsDataTable.Rows.Count];
          
                  foreach(DataRow row in gymsDataTable.Rows)
                  {
                      gymArray[count] = new gymArray();
                      gymArray[count].name = row["name"].ToString();
                      count++;
                  }
                  return gymArray;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2016-11-13
            • 1970-01-01
            • 1970-01-01
            • 2023-02-08
            • 2021-05-24
            • 2022-06-10
            • 2013-03-02
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多