Espero poder solucionar el problema, pero no puedo entender por qué este código no funciona correctamente y permitir que se agreguen entradas duplicadas a la lista.Prevención de la lista duplicada <T> Entradas
La condición de enunciado if
nunca se cumple, incluso cuando arrastro archivos idénticos desde la misma ubicación. No entiendo por qué el método "Contiene" no los está combinando.
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 { }
}
}
pensé que había encontrado otro método en el que para lograr esto usando "Distinto"
Sin embargo, parece checkedDragDropFiles
& dragDropFiles
tienen la misma cantidad de entradas, incluyendo los duplicados, excepto cuando se muestra dragDropFiles
en un ListBox
, no se muestran. ¿Por qué hace esto?
Necesito evitar cualquier entrada de lista duplicada, ya que crearía programáticamente un menú basado en los datos de la lista.
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 { }
}
lo que hace 'FileInfo's la misma, tal vez debería implementar un' 'IEqualityComparer para pasar a' Distinct' –
Jodrell
Sólo una nota: Si 'Contains' vuelve _true_, ¿por qué quitar y agregar? Realice una comprobación negativa y solo agregue si la lista no _no_ contiene el valor. – Oded
Oded: Buen punto, eso es un poco una acción desperdiciada. – negligible