Как сравнить элементы двух списков и скопировать уникальные элементы в новый список - PullRequest
0 голосов
/ 08 мая 2019

У меня есть три списка. В левом и среднем списке есть несколько пунктов. Я хочу сравнить элементы в левом и среднем списке. Я хочу переместить уникальные элементы в правый список из среднего списка и мне нужен дескриптор выражения.

Я попытался сделать это с кодом внизу.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    List<string> FileNames = null;


    private void Btn_FileFolder_Click(object sender, EventArgs e)
    {
        using (FolderBrowserDialog FBDfolder = new FolderBrowserDialog())
        {

            if (FBDfolder.ShowDialog() == DialogResult.OK)
            {
                lbl_FolderPath.Text = FBDfolder.SelectedPath;
                FileNames = Directory.GetFiles(FBDfolder.SelectedPath).ToList();
                lstbx_filefolder.DataSource = FileNames.Select(f => Path.GetFileName(f)).ToList();
                lbl_NoOfFolderItems.Text = lstbx_filefolder.Items.Count.ToString();
            }
        }
    }

    private void Btn_TextFile_Click(object sender, EventArgs e)
    {
        OpenFileDialog textfile = new OpenFileDialog {
            Filter = "text (*.txt)|*.txt"
    };

        if (textfile.ShowDialog() == DialogResult.OK)
        {
            lbl_filepath.Text = textfile.FileName;

            string[] lines = File.ReadAllLines(lbl_filepath.Text);
            lstbx_textfile.Items.AddRange(lines);
            lbl_NoOfItems.Text = lstbx_textfile.Items.Count.ToString();

        }

    }

    private void Form1_Load(object sender, EventArgs e)
    {

    }

    private void btn_RemoveDuplicates_Click(object sender, EventArgs e)
    {
        var listboxfile = lstbx_filefolder.Items;
        var listboxtext = lstbx_textfile.Items;

        foreach (var itm in listboxfile)
        {
            if (listboxtext.Contains(itm)) listboxtext.Remove(itm); 
        }
    }

    private void btn_clear_Click(object sender, EventArgs e)
    {
        lstbx_filefolder.DataSource = null;
        //lstbx_filefolder.Items.Clear();
        lstbx_textfile.DataSource = null;
        lstbx_textfile.Items.Clear();

    }
}

}

enter image description here

1 Ответ

0 голосов
/ 08 мая 2019

При работе с коллекциями во многих случаях вы можете использовать Linq для этих задач.

Первым шагом в решении вашей проблемы будет объединение списков в один список. Следующим шагом будет использование Linq для получения уникальных строковых значений из списка, это при назначении результата запроса Linq новому списку.

При использовании Distinct() дубликаты удаляются. В результате чего-то вроде этого:

private void btn_RemoveDuplicates_Click(object sender, EventArgs e)
{
    var itemCollection = new List<string>();
    itemCollection.AddRange(lstbx_filefolder.Items);
    itemCollection.AddRange(lstbx_textfile.Items);


    var uniqueCollection = itemCollection.Distinct().ToList();

   // todo assign the values in the uniqueCollection to the source of the right listbox.
   `rightListBox`.Datasource = uniqueCollection; 
}
...