我试图找出解决这个“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 回答
如果我这样做,我将创建一个包含两个数据表(电影,演员)和它们之间的数据化的数据集,以便电影表的actorid列被键入到actor表id列 . 原因是数据表可以通过绑定源直接连接到列表框,然后在一个列表中更改所选项自动细化另一个列表(当第二个列表bindingsource将其数据源设置为datarelation时
这基本上是人们在创建自定义类时讨论的方法;数据集设计器创建表本身就是自定义类
然而,这可能有点涉及 . 您可以在更多手动意义上实现更简单的解决方案 - Build 两个Dictionary>对象以将actor与电影相关联,反之亦然 . 像这样填充字典(将您的p1和p2变量重命名为更合理的字体):
注意:第一次添加特定密钥时,它将不存在,因此最好使您的添加代码工作如下:
现在用
actorsToMovie.Keys
的内容填充你的演员列表框 - 一个重复的演员名字列表现在将一个事件处理程序附加到actor列表框中选择索引已更改事件 . 您可以通过goin到窗体的可视化设计器,左键单击列表框,在右侧的属性网格中,单击照明螺栓选项卡以查看alll事件 . 找到SelectedIndexChanged并双击它旁边的空白区域 . 视图将切换到代码,您的任务是编写事件处理程序的代码 . 事件处理程序代码应该:
使用
moviesListbox.Items.Clear()
清除电影列表框从演员列表框中获取当前选中的演员,
var actor = actorsListBox.SelectedItem.ToString()
现在循环遍历从actorsToMovies [actor]中检索到的列表中的所有电影,并将它们添加到列表框中 . 您也可以添加范围:
moviesListbox.Items.AddRange(actorsToMovies[actor]);
当然,这可以用一个字典完成,但使用两个字典可以让你轻松列出任何给定电影的其他演员,例如