【问题标题】:When should I use List of Array (i.e. List<string []> = new List<string []>()) in C#?我什么时候应该在 C# 中使用数组列表(即 List<string []> = new List<string []>())?
【发布时间】:2018-02-18 13:33:32
【问题描述】:

上下文

我有两个用户输入字段,我想将输入数据保存到字符串数组列表中(NOT 在文件或数据库中)。

作为我未来工作的一部分,我必须按特定值执行搜索并列出/显示用户迄今为止输入的所有输入。此外,一个输入字段的值应该与另一个输入字段相关联。 例如-在第一个字段中用户写“Nice”,第二个字段他写了多个单词-“beautiful”、“Excellent”。这意味着最后两个词应该属于第一个词——“Nice”。很像一个同义词应用程序

但是,此时,我的重点是存储输入,当用户单击 Save 按钮时会发生这种情况。

代码

实现接口的类:

class SynonymApp : ISynonym
{
    private List <string[]> allItems = new List <string[]>();

    public void AddSynonyms(IEnumerable<string> synonyms)
    {
        //adding objects at the end of the list. Am I doing right?
        allItems.Add((synonyms.ToArray<string>()));
    }
}

按钮点击事件发生的类:

private void button1_Click(object sender, EventArgs e)
{
    List<string> userInput = new List<string>();
    string wordInput = textBox1.Text;
    if (wordInput == "") throw new Exception("Please give input");

    char[] emptySpace = new char [] {' ', '\t'};
    string[] synonymInput = textBox2.Text.Split(emptySpace);
    userInput.Add(wordInput);
    userInput.AddRange(synonymInput);
    synonymApp.AddSynonyms(userInput);
}

问题

  1. 将字符串输入保存到数组列表中,而不是简单的Listarray 是正确的选择吗?一般而言,ListArray 的作用是什么?
  2. 我的数组列表(即private List &lt;string[]&gt; allItems = new List &lt;string[]&gt;();)会根据需要增长吗?

【问题讨论】:

  • 您能澄清一下您在第 2 项中的要求吗?数组不会改变大小。当您向列表中添加更多项目时,列表会变得更大。
  • 约翰,是的,我已经澄清了。
  • 是的,您的列表会随着您需要添加新数组而增加。
  • 也许您应该使用列表列表:List&lt;List&lt;string&gt;&gt;

标签: c# arrays list arraylist generic-list


【解决方案1】:

将字符串输入保存到数组列表中,而不是简单的列表或数组是正确的选择吗?一般来说,数组列表有什么作用?

在你的情况下,不。总是尽量保持简单。我从未见过List&lt;string[]&gt; 的用法。数组和列表是两个不同的东西,不应该合并。即使您使用它,它也很难维护、调试并且不会达到最佳效果。

我的数组列表(即private List &lt;string[]&gt; allItems = new List &lt;string[]&gt;();)会根据需要增长吗?

是的,但除非有特定原因,否则我会尽量避免使用List&lt;string[]&gt;


IMO,您应该将代码组织成类并使用HashSet,因为它通常比List 快。

class MySynonyms
{
    public string Word { get; set; }
    public HashSet<string> Synonyms { get; set; }
}

希望这会有所帮助。

【讨论】:

  • SiD,感谢您的回答。这对我来说很清楚。我会尽快接受你的回答。但作为最后一个问题 - allItems.Add((synonyms.ToArray()));它实际上会将项目添加到列表中还是将数组添加到列表中?
  • @Simon,它会将数组添加到列表中。也想告诉你synonyms.ToArray&lt;string&gt;()synonyms.ToArray()是一样的。
【解决方案2】:

如果您真的希望输入中的第一个单词“拥有”其他两个单词,我会使用Dictionary&lt;string, List&lt;string&gt;&gt;。这将原始单词与同义词分开,并使其可搜索。

您是正确的,您需要多维存储(数组列表、数组数组等)。或者,更好的是,创建一个SynonymEntry 类:

public class SynonymEntry
{
    public string EntryWord { get; set; }
    public List<string> Synonyms { get; set; }
}

然后您可以创建一个简单的List&lt;SynonymEntry&gt; 来存储所有数据。

列表与数组 - 如果我知道以后永远不会添加新信息,我只会使用数组。

【讨论】:

  • 感谢您的回答。但实际上我关心的是,一般来说,List of String 数组实际上是做什么的?如果您查看我的代码,请查看: allItems.Add((synonyms.ToArray()));它实际上会将项目添加到列表中还是将数组添加到列表中?
  • 这个网站上已经有数百个答案来描述这些对象的作用。如果您能理解string[]List,那么您将它们组合在一起以理解您的结构。此外,使用调试器检查添加的内容。
【解决方案3】:

您没有告诉应用程序的上下文(您只是说很像同义词应用程序),但如果您真的存储同义词,请知道同义词是二元关系;即如果 A 是 B 的同义词,则 B 也是 A 的同义词。

在这种情况下,我只是将您的所有单词(无论是主要单词还是同义词)存储在一个大字符串列表中 (List&lt;string&gt;)。除了这个列表,我还会在List&lt;(int ,int)&gt; 中存储另一个存储关系,存储每个元组中主词和同义词的索引。

如果您使用数据库来序列化此列表(您说过不会),这将转换为两个简单的表;单词(int ID,varchar Word)和关系(int ID1,int ID2)。

【讨论】:

    【解决方案4】:

    您可以改为使用 List> ,它会根据需要增长。另一种解决方案可能是 Dictionnary> 您应该尝试选择正确的解决方案。字符串数组不像列表那样容易增长。

    【讨论】:

      猜你喜欢
      • 2014-07-22
      • 2017-05-08
      • 2012-06-05
      • 2013-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 2010-10-18
      相关资源
      最近更新 更多