我被C#项目困住了,我不知道如何解决它。我有一个文本文件“ cars.txt”,它具有以下信息:
1950
日产Sentra
福特福克斯
1951
马自达5
马自达3
丰田
1952
雪佛兰
我必须有2个列表框和一个按钮。第一个列表框应该搜索文件并填充年份,当用户选择年份并单击按钮时,它会显示该特定年份的相应汽车型号。我曾考虑过使用StreamReader,但我不知道如何开始。 感谢您的帮助
答案 0 :(得分:1)
创建一个字符串列表字典,其中将包含带有年份和关键字的汽车列表以及年份列表:
private readonly Dictionary<int, List<string>> _carsByYear =
new Dictionary<int, List<string>>();
private readonly List<int> _years = new List<int>();
然后您可以用
填充它List<string> cars = null;
foreach (string line in File.ReadLines(@"C:\Users\Me\cars.txt")) {
if (!String.IsNullOrWhiteSpace(line)) {
if (Int32.TryParse(line, out int year)) { // We have a year
if (_carsByYear.TryGetValue(year, out var existingList)) {
cars = existingList;
} else {
// Add a new list with year as the key
_years.Add(year);
cars = new List<string>();
_carsByYear.Add(year, cars);
}
} else { // We have a car
cars.Add(line);
}
}
}
现在,您可以将_years
分配给第一个ListBox的DataSource
。您可以使用
SelectedIndexChanged
事件)
int year = (int)listBox1.SelectedItem;
今年,您可以通过以下方式获取汽车清单
var selectedCarList = _carsByYear[year];
将其分配给第二个ListBox的DataSource
。
答案 1 :(得分:0)
现在没有错误,但没有任何显示。这是非常具有挑战性的 分配。我班上的每个人都被困住了。
对我来说很好。这是一个变体,其中包含一些使用方式的示例:
private readonly SortedList<int, SortedSet<string>> _carsByYear = new SortedList<int, SortedSet<string>>();
private void button1_Click(object sender, EventArgs e)
{
SortedSet<string> cars = null;
string fileName = System.IO.Path.Combine(
System.Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"cars.txt");
foreach (string line in File.ReadLines(fileName))
{
if (!String.IsNullOrWhiteSpace(line))
{
if (Int32.TryParse(line, out int year))
{ // We have a year
if (!_carsByYear.ContainsKey(year))
{
cars = new SortedSet<string>();
_carsByYear.Add(year, cars);
}
else
{
cars = _carsByYear[year];
}
}
else
{ // We have a car
if (!cars.Contains(line))
{
cars.Add(line);
}
}
}
}
listBox1.DataSource = _carsByYear.Keys.ToList();
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (listBox1.SelectedIndex != -1)
{
listBox2.DataSource = _carsByYear[(int)listBox1.SelectedItem].ToList();
}
}
private void button2_Click(object sender, EventArgs e)
{
if (listBox1.SelectedIndex != -1 && listBox2.SelectedIndex != -1)
{
int year = (int)listBox1.SelectedItem;
string car = listBox2.SelectedItem.ToString();
label1.Text = year.ToString();
label2.Text = car;
}
else
{
label1.Text = "";
label2.Text = "";
}
}
如果仍然无法正常工作,请提供更多详细信息有关文件的内容以及在界面中使用该文件的方式。