私は回避することができますが、私の人生はなぜこのコードが正しく機能していないのか理解できず、重複するエントリをリストに追加することができません。重複するリストを防止する<T>のエントリ
if
同一のファイルを同じ場所からドラッグしても、文の条件は決して満たされません。私はなぜ、 "Contains"メソッドがそれらと一致しないのか理解していません。
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 { }
}
}
は私が達成する別の方法を見つけたと思ったこの
しかし、除いて、checkedDragDropFiles
& dragDropFiles
は重複を含むエントリ、同じ量を持って表示されます使用して「個別」 dragDropFiles
がListBox
に表示されている場合は表示されません。それはなぜこれをするのですか?
リストデータに基づいてメニューをプログラムで作成するので、重複したリストエントリを防ぐ必要があります。
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 { }
}
'FileInfo'sを同じものにするには、おそらく、' IEqualityComparer 'を' Distinct'に渡すべきです。 –
Jodrell
'Contains'が_true_を返すなら、なぜ削除して追加しますか?否定的なチェックを行い、リストに値が含まれていない場合のみ追加します。 – Oded
Oded:良い点、それはちょっと無駄な行動です。 – negligible