Tôi hy vọng tôi sẽ có thể thực hiện công việc nhưng tôi không thể cho cuộc sống của tôi hiểu tại sao mã này không hoạt động chính xác và cho phép nhập các mục trùng lặp vào Danh sách.Ngăn danh sách trùng lặp <T> Entries
Điều kiện tuyên bố if
không bao giờ được đáp ứng, ngay cả khi tôi kéo các tệp giống hệt nhau từ cùng một vị trí. Tôi không hiểu tại sao phương pháp "Chứa" không phù hợp với chúng.
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 { }
}
}
tôi nghĩ rằng tôi đã tìm thấy một phương pháp trong đó để đạt được điều này bằng "biệt"
Tuy nhiên, dường checkedDragDropFiles
& dragDropFiles
có cùng một lượng mục, trong đó có bản sao, ngoại trừ khi dragDropFiles
được hiển thị trong một ListBox
, nó không hiển thị chúng. tại sao nó làm vậy?
Tôi cần phải ngăn chặn bất kỳ mục nhập danh sách trùng lặp nào, vì tôi sẽ lập trình tạo trình đơn dựa trên dữ liệu danh sách.
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 { }
}
điều gì làm cho 'FileInfo' giống nhau, có lẽ bạn nên triển khai một 'IEqualityComparer' để chuyển đến 'Distinct' –
Jodrell
Chỉ cần lưu ý: Nếu 'Contains' returns _true_, tại sao xóa và thêm? Thực hiện kiểm tra âm và chỉ thêm nếu danh sách không _not_ chứa giá trị. – Oded
Oded: Điểm tốt, đó là kinda một hành động lãng phí. – negligible