【问题标题】:How "Questions" in List<Questions> relate to "T" in List<T>?List<Questions> 中的“问题”如何与 List<T> 中的“T”相关联?
【发布时间】:2016-07-19 03:24:42
【问题描述】:

我正在开发一个处理列表的应用程序。我有两个脚本;一个处理特定类的;第二个处理应用程序中的所有其他内容。这是一个真假游戏/应用程序,我正在通过在线教程学习制作。

第一个脚本是一个 [System.Serializable] 脚本,它只包含一个字符串和一个布尔值。这里的字符串是问题,布尔值验证问题。主游戏控制器脚本从类中创建了一个数组,它还包含一个未回答问题的列表,一旦提出问题,这些问题将定期更新。

我不太明白的代码行是

private static List<Questions> UnansweredQuestions;

其中“问题”是包含问题和布尔值的类。

&lt;Questions&gt; 的具体功能是什么。我知道List&lt;T&gt; 中的 T 指的是列表中元素的类型;通常是字符串或整数。 T 作为一个类在这里是如何定义的?假设 Questions 类包含一个字符串和一个布尔值,是否意味着创建的列表是一个字典?

【问题讨论】:

  • 我不确定我是否完全理解您的意思,但列表可以是任何内容的列表,包括自定义类(例如问题)。现在,list 只是一个袋子,在那个袋子里你可以装球、硬币,甚至是其他更小的袋子,里面装着其他物品。
  • @Ghasan 不要与System.Collections.Concurrent.ConcurrentBag&lt;T&gt; 混淆(尽管它们相似)
  • @PCLuddite 谢谢!我指的是它的概念,但很高兴知道有一些类具有这样的名称:)

标签: c# generics


【解决方案1】:

不,List&lt;Question&gt; 不是字典。这是一个包含Questions 的List

List&lt;T&gt; 是泛型意味着它可以接受任何类型。编译器实质上从List 获取代码并将T 的所有实例替换为Question,就好像它是专门编写为Question 类型的列表一样。

List&lt;T&gt; 的核心是将元素存储在数组中,如private T[] _items。然后,只要空间不足,就会调整该数组的大小。

【讨论】:

    【解决方案2】:

    让我们分解一下

    private static List<Questions> UnansweredQuestions;
    

    访问修饰符private 意味着UnansweredQuestions 将只在它所定义的类的范围内可见。

    关键字static 表示您不需要类的实例。相同的UnansweredQuestions 对类的所有实例以及类中的其他静态属性/方法可见。

    服务的具体功能是什么。我知道 List 中的 T 指的是列表中元素的类型;通常是字符串或整数。

    List&lt;T&gt; 表示稍后命名的类型的列表。当您写 List&lt;Questions&gt; 时,您命名该类型。你告诉编译器你想要一个 Questions 对象的列表。

    假设 Questions 类包含一个字符串和一个布尔值,是否意味着创建的列表是一个字典?

    不,它实际上是一个列表。如果列表中至少有一个对象,则可以执行类似的操作

    Questions firstQuestion = UnansweredQuestions[0];
    if (firstQuestion.Answered == false) 
    {
        Console.WriteLine(firstQuestion.Text);
    }
    

    这假设您的布尔值称为已回答,而您的问题文本称为文本。

    【讨论】:

    • 我已经爱上了这个网站 :) 仍在努力相信它实际上有多大帮助。假设地说,如果我有一个构造函数,它定义了一个字符串和一个 int(基于两个 args)并用它们填充列表,它会接受构造函数作为列表的元素吗?
    • @BowieSalvatore 如果“接受构造函数”是指类似UnanswerQuestions.Add(new Question("How are you?", 3));,那么是的。
    • 即使您没有 2 参数构造函数,您也可以使用如下语法:UnansweredQuestions.Add(new Question() { Text = "How are you?", Answered = false });
    【解决方案3】:

    参考:https://msdn.microsoft.com/en-us/library/6sh2ey19(v=vs.110).aspx

    将其视为多个 T。类似于Array&lt;T&gt;。 T 可以是任何类型:int、string、Question 类等。例如:

    Question question1 = new Question(); // only 1 question
    
    List<Question> questions = new List<Question>(2);
    questions.Add(new Question());  // 1st question added
    questions.Add(new Question());  // 2nd question added
    
    // access the second question by:
    Question secondQuestion = questions[1];
    

    【讨论】:

      【解决方案4】:

      &lt;T&gt; 是一个object,它是一切的基础,就像List&lt;System.Object&gt;。当您声明 List&lt;string&gt; 时,它会使用 System.String 类创建一个列表。

      此代码:private static List&lt;Questions&gt; UnansweredQuestions;,使用Question 类创建一个列表。

      所以这段代码:

      private static List<Question> UnansweredQuestions = new List<Question>(10);
      

      使用 Question 类创建一个 10 长的列表。就像Array:

      private static Question[] UnansweredQuestions = new Question[10];
      

      List's 和Array's 节省空间和时间,所以你不必使用这样的东西:

      private static Question UnansweredQuestion1 = new Question();
      private static Question UnansweredQuestion2 = new Question();
      private static Question UnansweredQuestion3 = new Question();
      private static Question UnansweredQuestion4 = new Question();
      private static Question UnansweredQuestion5 = new Question();
      private static Question UnansweredQuestion6 = new Question();
      private static Question UnansweredQuestion7 = new Question();
      private static Question UnansweredQuestion8 = new Question();
      private static Question UnansweredQuestion9 = new Question();
      private static Question UnansweredQuestion10 = new Question();
      

      加上List's 和Array's 允许索引,因此您可以获得类似MyListOrArray[4] 的项目。这将返回该索引处的项目。而在上面的示例中,有 10 个变量,您必须单独获取它们的值,例如 UnansweredQuestion4

      【讨论】:

        猜你喜欢
        • 2020-03-07
        • 2015-11-19
        • 1970-01-01
        • 2015-11-05
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 2013-06-28
        相关资源
        最近更新 更多