gpt4 book ai didi

c# - 循环创建新对象并将其添加到 ArrayList

转载 作者:太空宇宙 更新时间:2023-11-03 19:56:35 26 4
gpt4 key购买 nike

编辑以避免您阅读整篇文章tldr:一个对象的字段不应该是静态的,除非您希望该对象的所有实例都具有相同的字段值

我正在尝试创建和填充 Blog 对象的 ArrayList。我确实知道这样做的通用方法:

create ArrayList of Blogs
loop (some condition)
create new Blog
add this Blog to AL

但是,当我尝试在 while(datareader.read()) 循环中执行此操作时,ArrayList 中的所有元素都是完全相同的 Blog。具体来说,我最终得到一个 ArrayList,其中包含多个指向数据库表中最后一个 Blog 对象的指针。这是我的代码:

 public static ArrayList AllBlogs()
{
SqlDataReader dr = anonPage.ExecuteReader("SELECT * FROM Kristina_Blogs");

ArrayList allBlogs = new ArrayList();

if (dr.HasRows)
{
while (dr.Read())
{
Blog b = new Blog();

//grab a row from Kristina_Blogs and assign those attributes to b
b.setTitle(dr["title"].ToString());
b.setMessage(dr["message"].ToString());
b.setId(dr["id"]);

allBlogs.Add(b);
}
}
dr.Close();
return allBlogs;
}

正如我之前所说,其结果是一个 ArrayList,其中填充了指向 Kristina_Blogs 表中最后一个博客的指针。我想象 ArrayList allBlogs 看起来像 [b, b, b, ... b] 因此当我说 b.setTitle() 等时它们都会更新。但是如果我创建一个新的 Blog 对象怎么会这样在每次迭代的开始?


这里有一些您不必阅读的额外信息,但它可能会消除对问题结构的一些困惑:

  1. Blog 对象有 id、title 和 message 字段以及它们各自的 getter/setter
  2. Kristina_Blogs 是代表这些博客的表,其中包含 id、标题、消息列
  3. 建议说要为我的数据库引擎添加一个标签,但我找不到它的标签:Microsoft SQL Server Management Studio
  4. 当我使用字符串 ArrayList 而不是 Blogs 时,这段代码工作得很好

编辑:包括来自 Blog 类的代码

public class Blog
{
public App myApp;
public static string Title;
public static string Message;
public static int Id;

//constructors
public Blog() { }
public Blog(App App) { this.myApp = App; }

//all getters and setters look like this
public string getTitle() { return Title; }
public void setTitle(string t) { Title = t; }

}

最佳答案

正如我在评论中提到的,您遇到的主要问题是您的成员变量是静态的,因此当您设置值时,它们会在所有实例中发生变化。你应该这样改变你的代码:

public class Blog
{
public int Id { get; set; }
public string Title { get; set; }
public string Message { get; set; }
}

并以这种方式填写您的列表,不要忘记添加 using System.Linq;:

var result = new List<Blog>();
var connection = @"your connection string";
var command = "SELECT * FROM Kristina_Blogs";
var adapter = new System.Data.SqlClient.SqlDataAdapter(command, connection);
var dataTable = new DataTable();

//Get data
adapter.Fill(dataTable);

dataTable.Rows.Cast<DataRow>().ToList()
.ForEach(row =>
{
var b = new Blog();
b.Id = row.Field<int>("Id");
b.Title = row.Field<string>("Title");
b.Message = row.Field<string>("Message");

result.Add(b);
});

return result;

注意:

  • 创建成员时static ,它在该类的所有实例之间共享。
  • 在 C# 中,您可以使用 property获取或设置值,你不需要setXsetY,当你获取一个属性的值时,get代码该属性将执行,当您为属性赋值时,它的 set 部分将执行。您可以这样定义属性:

属性:

private int id;
public int Id
{
get
{
return id;
}
set
{
id = value;
}
}

或更简单:

public int Id { get; set; }

关于c# - 循环创建新对象并将其添加到 ArrayList,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33110998/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com