Je m'attends à ce que je puisse faire un travail autour, mais je ne peux pas comprendre pourquoi ce code ne fonctionne pas correctement et permettant d'ajouter des entrées en double à être ajoutées à la liste.
Le Si la condition de l'instruction code> n'est jamais remplie, même lorsque je fais glisser des fichiers identiques à partir du même emplacement. Je ne comprends pas pourquoi la méthode "contient" ne les correspond pas. P>
P>
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 { }
}
4 Réponses :
dans le cas de Vous devez utiliser la surcharge de Vous pouvez également utiliser liste
fileinfo code>, la méthode code> contient code> vérifiera si les références sont identiques, mais lorsque vous récupérez un tout neuf em > Ensemble de
fichierInfo code>, les références sont différentes. p>
contient code> qui prend un
iéqualitycomparer code> - voir
hashset
Dans ce cas, cela ne vous aiderait pas correctement? (FileInfo est comparé par référence, pas de valeur).
hashset
@JEFFEFTOSTER Je suis shur que vous puissiez utiliser un wrapper, améliorer ce wrapper avec iéquatif
anse code> et
.gethashcode code> et < code> hashset
@Jefffoster - tout à fait juste. Mise à jour déjà ma réponse à cet effet.
Pour la question de la performance, je n'utiliserais pas list
.Contains code> ou
. Nan code> (qui manque de comparaison basée sur hachage) - "meilleur" cas: chaque itération ajoute un article ... pourquoi pas Créer un
Dictionnaire
FULLNAME CODE>. Cela vous donnera un boost de performance, comme
.Containskey code> fera une vérification basée sur HASH (tandis que la liste
.values code> -Property ...
Merci, je pense que cette méthode peut être bénéfique pour moi plus tard, car j'aurai besoin d'une référence unique pour permettre à l'utilisateur de supprimer des outils de Toolstripmenuitem spécifiques qui seront générés sur la base de la liste.
@Andreasniedermair Il n'est pas nécessaire d'utiliser une enveloppe; Vous pouvez fournir votre propre implémentation de IequalityComparer
@Phoog Ah, n'a pas pensé à l'autre Ctor ... merci! Quoi qu'il en soit, je n'utiliserais pas hashset
Parce que la mise en œuvre par défaut Vous pouvez utiliser LINQ pour spécifier votre prédicat de comparaison personnalisé afin de comparer des objets par différentes propriétés: P > objet.equals CODE> compare les objets par référence, pas par la valeur. Chaque instance
fileInfo code> que vous créez est un objet différent, en ce qui concerne .NET est concerné.
private void OutputDragDrop(string[] files)
{
dragDropFiles = files.Distinct().Select(f => new FileInfo(f)).ToList();
debugList.DataSource = checkedDragDropFiles;
debugList2.DataSource = dragDropFiles;
}
Long Time depuis que j'ai vu si (dragdropfiles.ca (f => f.name == fichier) == false) code> ... :)
if (! dragdropfiles.ca (f = > F.Name == Fichier)) Code>
@Andreas: C'est la façon dont nous l'avons fait dans les vieux jours. :-D juste rigoler. En fait, je ne l'ai fait que souligner que j'ai inversé la logique d'OP (ajout à la liste est maintenant fait à l'intérieur du conditionnel).
:) eh bien ... un ! code> pourrait facilement être manqué
Attention: cela pourrait fonctionner pour ce cas particulier - mais dans d'autres secenarios, je préférerais aller pour une comparaison invariante et d'ignorer. Cela peut être facilement fait en passant system.stringcomparer.currentcultureignorecase code> ou
system.stringcomparer.invariantcultureignorecase code> dans
.distinct code>
@Andreasniedermairir: Afaik, deux noms de fichiers ne peuvent pas rester dans un même dossier et ne diffèrent que par le boîtier, mais s'il y a un potentiel que les noms de fichiers pouvaient obtenir un boîtier différent, je suis d'accord, ce serait plus sûr.
Je crois que vous pouvez le faire sur * Nix Systems - pas sûr de cependant (comme je ne suis pas un gars de pingouin ...) ... en plus de cela: c'est pourquoi j'ai dit "mais dans d'autres scénarios"
Merci pour la réponse mais pourriez-vous expliquer où vient la variable "F"? Comment est-il déclaré comme le bon type?
EDIT: OK, donc sur les tests, j'ai découvert que cette solution ne fonctionne pas. Bien qu'il n'ayant pas affiche les éléments en double lorsque je dépose la liste dans une liste de liste, elle ajoute toujours l'entrée en double à ma liste. J'ai pris une capture d'écran pour démontrer ceci: i42.tinypic.com/5znrd.png programme en cours d'exécution: i42.tinypic.com/xc7rpi.png
@negligible: effacez-vous la liste avant d'ajouter des éléments ( dragdropfiles.clear () code>), si vous répétez cette action? Je ne vois pas comment il pourrait ajouter des doublons s'il est initialement vide. Il pourrait y avoir une possibilité d'avoir des boîtiers différents, mais ils semblent égaux en fonction de votre capture d'écran. Si vous ne voulez pas l'effacer, au lieu de
addrange code>, changez simplement la liste entière (j'ai mises à jour ma réponse) b>.
@Groo: Cela générera de manière dynamique un élément de menu contextuel pour chaque élément de liste. Donc, si j'ai effacé les dragdropfiles à chaque fois que l'utilisateur doit les faire glisser dans l'application pour qu'ils apparaissent à nouveau sur le menu. (J'ai longtemps terminé ce projet actuel maintenant)
Vous pouvez facilement créer plusieurs instances FileInfo pour le même fichier - votre liste contiendra chaque fichierInfo une seule fois, mais il peut avoir plusieurs fichiersInfos pour le fichier SMAE. P>
Donc, votre meilleur pari peut être d'utiliser une hache et d'utiliser FILEInfo.fulName comme critère. P>
Si vous souhaitez une implémentation de ICOLLECLE
triède
plutôt que liste
Qu'est-ce qui fait
fileinfo code> s idérable, vous devez peut-être implémenter un
iéqualitycomparer code> pour passer à
distinct code>
Juste une note: si
contient code> renvoie true i>, pourquoi supprimer et ajouter? Faites une vérification négative et seulement ajouter si la liste ne pas i> contient la valeur.
Oded: Bon point, c'est un peu une action gaspillée.