首页 文章

C#2D字符串列表/数组 . 将与某个名称关联的项目组合在一起,并将它们分配给数组中的该名称

提问于
浏览
1

我试图找出解决这个“listArray-assignment”问题的最佳方法 . 我打开一个txt文件(下面提供的文件中的行的示例)并使用File.ReadAllLines读取它 . 从那里,我将所有actor添加到listBox1(同时避免添加重复的名称) .

这是最容易的部分;这是踢球者:txt文件包含与演员相关的电影 . 当在listBox1中选择这些影片中的演员时,这些影片必须出现在listBox2中 . 实际上,许多演员都有多部电影(参考我要设置一个2D数组,将第一个列表存储为演员列表,将第二个列表存储为电影列表,其中电影被分配给各自的演员 .

为了澄清,如果“John”有电影“a”“b”和“c”,则John应该是列表1中的元素 . 列表2(对应于“John”)应该分配给值a,b和c (因为他们是约翰的电影) .

我的两个想法是1)列表和2)列表>但我填写这些列表的尝试是无效的 .

如果您了解如何解决这个问题,我将非常感谢您权衡:)

让我知道我的任何一种方法是否有效(以及如何实施)或者我是否需要完全改变我的方法 . 谢谢!!

InitializeComponent();

        List<string[]> map_data = new List<string[]>();  // idea1
        List<List<string>> jake = new List<List<string>>(); // idea2

        var logFile = System.IO.File.ReadAllLines(@"C:\\Users\\jake\\Desktop\\movies.txt"); // absolute path -- CHANGE LATER
        var logList = new List<string>(logFile);    // reads lines and puts them in an array

        for (int i = 0; i < logList.Count; i++)
        {
            string j = logList[i].ToString();   // takes given element of list and casts to string
            string[] parts = j.Split(',');  // splits text file lines into [actor],[movie]
            string p1 = parts[0];   // p1 = actor
            string p2 = parts[1];   // p2 = movie
            if (listBox1.Items.Contains(p1))    // if actor already inserted
            {   
            }
            else
            {
                listBox1.Items.Add(p1); // adds person to listbox if not already added (dups exist)
            }
        }

txt文件的前5行(演员,电影):

莱斯利霍华德,皮格马利翁

Wendy Hiller,Pygmalion

Ray Milland,法语无泪

迈克尔雷德格雷夫,认真的重要性

Ray Milland,正在认真的重要性//第二部电影Ray Milland

1 回答

  • 1

    如果我这样做,我将创建一个包含两个数据表(电影,演员)和它们之间的数据化的数据集,以便电影表的actorid列被键入到actor表id列 . 原因是数据表可以通过绑定源直接连接到列表框,然后在一个列表中更改所选项自动细化另一个列表(当第二个列表bindingsource将其数据源设置为datarelation时

    这基本上是人们在创建自定义类时讨论的方法;数据集设计器创建表本身就是自定义类

    然而,这可能有点涉及 . 您可以在更多手动意义上实现更简单的解决方案 - Build 两个Dictionary>对象以将actor与电影相关联,反之亦然 . 像这样填充字典(将您的p1和p2变量重命名为更合理的字体):

    actorsToMovies[actor].Add(movie);
    moviesToActors[movie].Add(actor);
    

    注意:第一次添加特定密钥时,它将不存在,因此最好使您的添加代码工作如下:

    if(!actorsToMovies.ContainsKey(actor))
      actorsToMovies[actor] = new List<string>();
    actorsToMovies[actor].Add(movie);
    

    现在用 actorsToMovie.Keys 的内容填充你的演员列表框 - 一个重复的演员名字列表

    现在将一个事件处理程序附加到actor列表框中选择索引已更改事件 . 您可以通过goin到窗体的可视化设计器,左键单击列表框,在右侧的属性网格中,单击照明螺栓选项卡以查看alll事件 . 找到SelectedIndexChanged并双击它旁边的空白区域 . 视图将切换到代码,您的任务是编写事件处理程序的代码 . 事件处理程序代码应该:

    • 使用 moviesListbox.Items.Clear() 清除电影列表框

    • 从演员列表框中获取当前选中的演员, var actor = actorsListBox.SelectedItem.ToString()

    • 现在循环遍历从actorsToMovies [actor]中检索到的列表中的所有电影,并将它们添加到列表框中 . 您也可以添加范围: moviesListbox.Items.AddRange(actorsToMovies[actor]);

    当然,这可以用一个字典完成,但使用两个字典可以让你轻松列出任何给定电影的其他演员,例如

相关问题