我何时应该在C#中使用List of Array(即List <string [] =“”> = new List <string [] =“”>())?

时间:2018-02-18 13:33:33

标签: c# arrays list arraylist generic-list

上下文

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

作为我未来工作的一部分,我将不得不按特定值执行搜索,并列出/显示用户目前输入的所有输入。而且,一个输入字段的值应该与其他输入字段相关联。 例如,在第一个字段中,用户写入&#34; Nice&#34;,第二个字段,他写了多个单词 - &#34; beautiful&#34;,&#34; Excellent&#34;。这意味着最后两个单词应该属于第一个单词 - &#34; Nice&#34;。非常类似于同义词应用程序

但是,此时,我的重点是存储用户点击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的数据列表中是正确的选择吗?一般来说List Array会做什么?
  2. 我的数组列表(即private List <string[]> allItems = new List <string[]>();)会根据需要增加吗?

4 个答案:

答案 0 :(得分:2)

如果你真的想要输入中的第一个单词&#34;拥有&#34;另外两个,我会使用>>> [b for a, b in sorted(pair for pair in zip(list2, list1) if pair[0] != '')] ['d', 'a', 'b'] 。这将原始单词与同义词分开,并使其可搜索。

你是正确的,你需要多维存储(数组列表,数组数组等)。或者,更好的是,创建一个Dictionary<string, List<string>>类:

SynonymEntry

然后你可以创建一个简单的public class SynonymEntry { public string EntryWord { get; set; } public List<string> Synonyms { get; set; } } 来存储所有数据。

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

答案 1 :(得分:2)

  

是否只是通过一个简单的List或数组将字符串输入保存到Array of List中是正确的选择?一般来说,数组列表的作用是什么?

在你的情况下,不。总是试着保持简单。我从未见过使用List<string[]>。数组和列表是两个不同的东西,不应该组合。即使您使用它也很难维护,调试并且不会更加优化。

  

我的数组列表(即private List <string[]> allItems = new List <string[]>();)会根据需要增加吗?

是的,但除非有特殊原因,否则我会尽量避免使用List<string[]>

IMO,您应该将代码整理到类中并使用HashSet,因为它通常比List更快。

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

希望这有帮助。

答案 2 :(得分:0)

你没有告诉你的应用程序的上下文(你刚才说非常像一个同义词应用程序),但如果你真的在存储同义词,那么知道同义词是一个二元关系;即,如果A与B同义,则B也是A的同义词。

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

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

答案 3 :(得分:0)

您可以使用List&lt; List&lt; string&gt;&gt;哪个会根据需要增长。另一种解决方案可以是Dictionnary&lt; string,List&lt; string&gt;&gt;你应该尝试选择合适的。字符串数组不像列表那样容易增长。