Mi aspetto che riuscirò a risolvere il problema ma non riesco a capire perché questo codice non funzioni correttamente e che consenta l'aggiunta di voci duplicate all'elenco.Preventing Duplicate List <T> Entries
La condizione dell'istruzione if
non viene mai soddisfatta, anche quando trascino file identici dalla stessa posizione. Non capisco perché il metodo "Contiene" non li combini.
public class Form1:Form {
private List<FileInfo> dragDropFiles = new List<FileInfo>();
private void Form1_DragDrop(object sender, DragEventArgs e) {
try {
if (e.Data.GetDataPresent(DataFormats.FileDrop)) {
string[] files =
(string[])e.Data.GetData(DataFormats.FileDrop);
OutputDragDrop(files);
}
}
catch { }
}
private void Form1_DragEnter(object sender, DragEventArgs e) {
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.Copy;
else
e.Effect = DragDropEffects.None;
}
private void OutputDragDrop(string[] files) {
try {
foreach (string file in files) {
FileInfo fileInfo = new FileInfo(file);
if (dragDropFiles.Contains(fileInfo)) {
dragDropFiles.Remove(fileInfo);
}
dragDropFiles.Add(fileInfo);
}
PopulateContextMenu();
}
catch { }
}
}
pensavo di aver trovato un altro metodo in cui per raggiungere questo obiettivo utilizzando "Distinto"
Tuttavia, sembra checkedDragDropFiles
& dragDropFiles
hanno la stessa quantità di voci, tra cui i duplicati, ad eccezione quando dragDropFiles
viene visualizzato in un ListBox
non li mostra. Perché fa questo?
Devo evitare voci di lista duplicate, poiché creo un menu in base ai dati dell'elenco.
private void OutputDragDrop(string[] files)
{
try
{
foreach (string file in files)
{
FileInfo fileInfo = new FileInfo(file);
//if (dragDropFiles.Contains(fileInfo))
//{
// dragDropFiles.Remove(fileInfo);
//}
dragDropFiles.Add(fileInfo);
}
List<FileInfo> checkedDragDropFiles = dragDropFiles.Distinct().ToList();
debugList.DataSource = checkedDragDropFiles;
debugList2.DataSource = dragDropFiles;
//PopulateContextMenu();
}
catch { }
}
ciò che rende 'FileInfo's lo stesso, forse dovresti implementare un' IEqualityComparer 'per passare a' Distinct' –
Jodrell
Solo una nota: Se 'Contains' restituisce _true_, perché rimuovere e aggiungere? Esegui un controllo negativo e aggiungi solo se l'elenco non contiene il valore _non_. – Oded
Odiato: buon punto, è piuttosto un'azione sprecata. – negligible