Выборка comboBox + проверка

форумчане! Есть CSV файл, который содержит 1000+ строк, имеет формат:

CPU_name,Socket
i7-7740X OEM,LGA 2066
Xeon W-2123,LGA 2066
Xeon W-2125,LGA 2066
Xeon W-2133,LGA 2066
Xeon W-2135,LGA 2066
i7-4820K BOX,LGA 2011
i7-4820K OEM,LGA 2011
Xeon E5-1620 v2,LGA 2011

Также есть comboBox12, который содержит в себе Сокеты, и есть comboBox13, который при выборе в comboBox12, допустим, сокета LGA 2011, должен содержать только список такой:

i7-4820K BOX
i7-4820K OEM
Xeon E5-1620 v2
Еще процессоры, которые идут в CSV. (такой же формат)

Есть код, который отделяет Socket'ы от CPU_name, но не могу придумать, как легко, в несколько строк, сделать так, чтобы при выборе сокет 2011, к примеру, выпадал список только из CPU_Name с этим сокетом.

Код при инициализации формы:


List<SOCKETintel> socksintel = SOCKETsIntel.GetSOCKETintelValues();
            foreach (SOCKETintel sock in socksintel)
            {
                if (!comboBox12.Items.Contains(sock.Socketintel))
                {
                    comboBox12.Items.Add(sock.Socketintel);
                }

                comboBox13.Items.Add(sock.CPU_Name);

                if (comboBox13.Items.Contains(sock.Socketintel))
                {
                    comboBox13.Items.Add(sock.CPU_Name);
                } 

Код для парсинга и считывания CSV:


public static class SOCKETsIntel
        {
            public static List<SOCKETintel> GetSOCKETintelValues()
            {
                string filePath = Path.Combine(GetPath + @"\INTEL_CPU\", "INTEL.csv"); // Sdelat' Proverky na nazvanie File;
                using (var reader = new StreamReader(filePath))
                using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
                {
                    var socksintel = new List<SOCKETintel>();
                    csv.Read();
                    csv.ReadHeader();
                    while (csv.Read())
                    {
                        var sock = new SOCKETintel
                        {
                            CPU_Name = csv.GetField<string>("CPU_name"),
                            Socketintel = csv.GetField<string>("Socket")
                        };
                        socksintel.Add(sock);
                    }
                    return socksintel;
                }
            }
        }

        // Sozdanie classa dlya parsinga Type/Brand/Model/Benchmark'a CPU;
        public class SOCKETintel
        {
            public string CPU_Name { get; set; }
            public string Socketintel { get; set; }
        }

Ответы (1 шт):

Автор решения: Bulson

пример работы

public partial class Form1 : Form
{
    private const string _socketAll = "Любой";

    //источники данных для комбобоксов
    private BindingSource _bsSockets;
    private BindingSource _bsCpus;

    //данные
    private List<SOCKETintel> _records;

    public Form1()
    {
        InitializeComponent();

        //привязка у комбобокса сокетов
        _bsSockets = new BindingSource();
        _bsSockets.DataSource = typeof(List<String>);
        _comboBoxSockets.DataSource = _bsSockets;

        //привязка у комбобокса процессоров
        _bsCpus = new BindingSource();
        _bsCpus.DataSource = typeof(List<SOCKETintel>);
        _comboBoxCpus.DataSource = _bsCpus;
        _comboBoxCpus.DisplayMember = nameof(SOCKETintel.CPU_Name);

        this.Load += Form1_Load;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        //получаем данные
        _records = DataContext.GetRecords();

        //заполняем комбобокс сокетов
        _bsSockets.Add(_socketAll);
        _records.Select(r => r.Socketintel)
                .Distinct()
                .ToList()
                .ForEach(s => _bsSockets.Add(s));

        //заполняем комбобокс процессоров
        UpdateComboBoxCpus(_socketAll);

        //подписка на событие выбора в комбобоксе сокетов
        _bsSockets.CurrentChanged += (s, a) => UpdateComboBoxCpus(_bsSockets.Current as String);
    }

    private void UpdateComboBoxCpus(string selectedValue)
    {
        _bsCpus.Clear();

        if (selectedValue.Equals(_socketAll))
        {
            //полный список
            _records.ForEach(r => _bsCpus.Add(r));
        }
        else
        {
            //список с выборкой по сокету
            _records.Where(r => r.Socketintel.Equals(selectedValue))
                    .ToList()
                    .ForEach(r => _bsCpus.Add(r));
        }
    }
}
→ Ссылка