【问题标题】:convert list of object to array将对象列表转换为数组
【发布时间】:2018-03-23 11:28:11
【问题描述】:

我在需要随机创建问题以便稍后使用它来创建试卷的地方工作,所以我要做的是创建代表问题的类 Gene 然后创建一个基因类型的列表 QuestionList 然后我通过循环创建基因对象并将它们存储在列表 QuestionList 中,现在我需要将列表转换为数组 s [] 但我不能。有谁可以帮忙?

这是我在外部类中定义的代码、类和列表

public class Gene
{
    public string question { get; set; }
    public string CLO { get; set; }
    public string type { get; set; }
    public Gene(string s, string t, string i)
    {
        this.question = s;
        this.type = t;
        this.CLO = i;
    }
  }
List<Gene> QuestionList = new List<Gene>();

然后循环创建位于函数中的对象以与sql建立连接

string s = "select * Question, CLO, Question_Type FROM QuestionBank WHERE (Subject = '" + sub + "') AND (chapter = '" + chapter + "') AND (Question_Type = '" + qt.name + "') ORDER BY RAND() LIMIT = '" + qt.numOfType;
                    SqlCommand cmd = new SqlCommand(s, con);
                    SqlDataReader dr;
                    con.Open();
                    dr = cmd.ExecuteReader();
                    dr.Read();
                    while (dr.Read())
                    {
                        string ques = dr["Question"].ToString();
                        string questype = dr["Question_Type"].ToString();
                        string quesCLO = dr["CLO"].ToString(); 
                        QuestionList.Add(new Gene (ques, questype, quesCLO));
                    }
                     con.Close();
                   }

现在我需要将列表转换为数组

 string[] s = QestionList.ToArray();

我也试试

 Gene[] s = QestionList.ToArray();

但它们都不起作用,它显示错误消息“字段初始化程序无法引用非静态字段方法或属性”?

【问题讨论】:

  • 你在哪里尝试Gene[] s = QestionList.ToArray();?您不能使用一个字段来初始化另一个字段
  • 是的,我解决了这个问题,但没有解决问题
  • @TimSchmelter 在外部类,主类
  • 外部/主类在哪里?如前所述,如果这是一个字段,则无法从另一个字段对其进行初始化。你可以这样做:Gene[] s =&gt; QestionList.ToArray()。但是当您访问此属性时,这总是会创建一个新数组。它被称为“表达式主体属性”
  • 不相关,但那个 SQL 是可怕危险的。请请请使用参数。像“Dapper”这样的工具将使整个事情变得微不足道并且允许参数,例如:Gene[] arr = con.Query&lt;Gene&gt;("select ... where foo = @subject and bar = @chapter ...", new { subject, chapter }).ToArray();

标签: c# sql arrays list


【解决方案1】:

字段初始值设定项不能引用非静态字段方法或 属性

问题是您有一个引用非静态字段、方法或属性的字段初始值设定项。 C# 编译器不会allow that

一种解决方案是从field 移动到property

Gene[] s { get { return QestionList.ToArray(); } }

上面的缺点是,每当您访问s 时,您实际上是在克隆QestionList(即它很昂贵)。

另一个是把你的领域留在那里:

Gene[] s;

并将其填充到您的构造函数中:

s = QestionList.ToArray();

在构造函数中这样做的好处是克隆只会发生一次。这也是缺点(如果您要更改 QestionList,那么 s 将不会反映这一点)。

【讨论】:

  • 这是 IMO 的一个坏主意;属性应该便宜且可重复(返回相同的值); ToArray() 既不便宜也不可重复。
  • 这是一个公平的观点@MarcGravell。更新以反映这一点。 我并不是说这是一个好的一般做法,只是试图呈现 OP 可能理解的代码。
【解决方案2】:

这应该工作:)。我认为您在错误的地方使用它。请显示您在哪里将列表转换为数组的代码。

string s = "select * Question, CLO, Question_Type FROM QuestionBank WHERE (Subject = '" + sub + "') AND (chapter = '" + chapter + "') AND (Question_Type = '" + qt.name + "') ORDER BY RAND() LIMIT = '" + qt.numOfType;
                SqlCommand cmd = new SqlCommand(s, con);
                SqlDataReader dr;
                con.Open();
                dr = cmd.ExecuteReader();
                dr.Read();
                while (dr.Read())
                {
                    string ques = dr["Question"].ToString();
                    string questype = dr["Question_Type"].ToString();
                    string quesCLO = dr["CLO"].ToString(); 
                    QuestionList.Add(new Gene (ques, questype, quesCLO));
                }
                 con.Close();
                 var geneArray = QuestionList.ToArray()
               }

【讨论】:

  • 但是我不需要在函数中初始化数组,因为我需要在另一个类中使用它们,但是谢谢我找到了解决方案。
【解决方案3】:

列表可以通过ToArray() 轻松转换为数组。这里真正的问题很简单:时间和地点。调用ToArray() 的代码在方法中很好,例如在方法的底部可以很好:

Gene[] GetThings(string subject, string chapter, ...)
{
   var list = new List<Gene>();
   ... some code that populates list

   return list.ToArray();
}

同样,在该方法结束时,您可以分配给属性或字段:

   SomeMember = list.ToArray();

【讨论】:

  • 但是我不需要在函数中初始化数组,因为我需要在另一个类中使用它们,但是谢谢我找到了解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 2014-12-20
相关资源
最近更新 更多