如何搜索文件并将其显示在列表框中?

时间:2019-05-03 21:47:52

标签: c# file search

我被C#项目困住了,我不知道如何解决它。我有一个文本文件“ cars.txt”,它具有以下信息:

  

1950
  日产Sentra
  福特福克斯
  1951
  马自达5
  马自达3
  丰田
  1952
  雪佛兰

我必须有2个列表框和一个按钮。第一个列表框应该搜索文件并填充年份,当用户选择年份并单击按钮时,它会显示该特定年份的相应汽车型号。我曾考虑过使用StreamReader,但我不知道如何开始。 感谢您的帮助

2 个答案:

答案 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)

  

现在没有错误,但没有任何显示。这是非常具有挑战性的   分配。我班上的每个人都被困住了。

对我来说很好。这是一个变体,其中包含一些使用方式的示例:

enter image description here

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 = "";
    }
}

如果仍然无法正常工作,请提供更多详细信息有关文件的内容以及在界面中使用该文件的方式。