1
votes

Différence entre la liste personnalisée et la liste de chaînes

J'ai 2 listes, la première est une liste de chaînes que je remplis avec la méthode Directory.GetFiles () et ma deuxième liste est personnalisée. Je n'ai que 2 champs dans ma liste personnalisée. Le premier est FilePath , le second est UniqueID . Ce que j'essaie de réaliser, c'est que je veux comparer la liste de chaînes avec le champ FilePath de ma liste personnalisée. J'ai besoin d'obtenir les modifications.

J'ai converti ma liste personnalisée en chaîne et essayé cette solution Différence entre deux listes Cela a parfaitement fonctionné mais dans mon cas, cela ne me sert à rien. J'ai besoin de comparer différents types de listes

Voici ma classe personnalisée que j'utilise comme modèle

List<IndexerListModel> T3 = XMLList.Except(WinFileList, new PathComparer()).ToList();

Et c'est ainsi que je l'ai déjà essayé

public class IndexerListModel
{
    public string FilePath = string.Empty;
    public string uniqueID = string.Empty;
}

Mais comme je n'utilise pas le même type sur ma liste, cela n'a pas fonctionné.

Je m'attendais à obtenir la différence comme une nouvelle liste qui me montre ces éléments "x" dans votre liste ont des chemins de fichiers différents ..

Mon objectif général est d'obtenir les modifications dans un dossier Windows au démarrage de l'application. Je saurai donc quels fichiers ont été ajoutés / supprimés / modifiés / renommés alors que mon application n'était pas en place


3 commentaires

var differentFilePaths = customList.Where (c =>! stringList.Contains (c.FilePath));


Vous pouvez utiliser Select pour projeter la propriété de chaîne que vous souhaitez comparer. Ensuite, Except fonctionne mais vous obtenez une List . Sinon, vous pouvez utiliser cette approche: XMLList.Where (x =>! WinFileList.Contains (x.FilePath)). ToList ()


List differentFilePaths = XMLList.Where (c =>! WinFileList.Contains (c.FilePath)). ToList (); cela m'a donné la liste des fichiers supprimés que je devrais également supprimer de mon XML pour le maintenir à jour. et si je supprime le "!" ce qui me donne la liste que je devrais vérifier attentivement si le contenu du fichier a changé jusqu'à présent, comment puis-je obtenir la liste des fichiers qui ont été ajoutés?


3 Réponses :


1
votes

Utilisez une jointure externe gauche

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;


namespace ConsoleApplication98
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> WinFileList = Directory.GetFiles("AllDirectories[i]", ".", SearchOption.AllDirectories).ToList();
            List<IndexerListModel> models = new List<IndexerListModel>();

            //use left outer join
            var results = (from w in WinFileList
                           join m in models on w equals m.FilePath into wm
                           from m in wm.DefaultIfEmpty()
                           select new { model = m, windFileList = w }).ToList();


        }
    }
    public class IndexerListModel : IEqualityComparer<IndexerListModel>
    {
        public string FilePath = string.Empty;
        public string uniqueID = string.Empty;
    }

}


3 commentaires

Si je change de classe comme vous le dites, est-ce que je pourrai utiliser Sauf pour obtenir les différences entre ma liste de types personnalisés et ma liste de types de chaînes?


Mon code vérifie deux propriétés FilePath et uniqueID alors que le code publié ne testait qu'une seule propriété. Je ne sais pas à quel format ressemble votre liste de chaînes. Je pense que vous devez en faire un cours.


C'est ainsi que je remplis ma liste de chaînes WinFileList = Directory.GetFiles (AllDirectories [i], ". ", SearchOption.AllDirectories) .ToList ();



1
votes

models.Except (models.Where (y => strings.Contains (y.FilePath)));


0 commentaires

2
votes

Si je comprends correctement le problème, la personnalisée contiendra le contenu d'un répertoire, par exemple C: \ Windows .

Nous utiliserons ensuite var myPathList = Directory.GetFiles (@ "C: \ Windows"). ToList (); pour récupérer le contenu d'un C: \ Windows code > au démarrage de l'application.

Le résultat serait une liste de chemins qui ne sont pas contenus dans notre

Si l'hypothèse ci-dessus est correcte, je suis venu avec cette solution:

public class IndexerListModel
{
    public string UniqueID { get; set; }
    public string FilePath { get; set; }
}

class Program
{
    static void Main(string[] args)
    {
        var myPathList = Directory.GetFiles(@"C:\Windows").ToList();

        List<IndexerListModel> myModelList = new List<IndexerListModel> {
            new IndexerListModel {
            UniqueID= "0001",
            FilePath = @"C:\Windows\bfsvc.exe"
        },
            new IndexerListModel {
            UniqueID= "0002",
            FilePath = @"C:\Windows\diagwrn.xml"
        }
        };

        var result = myPathList.Where(path => !myModelList.Any(model => model.FilePath == path)).ToList();
    }
}

Lorsque j'exécute l'application, j'ai un total de 27 fichiers dans mon C: \ Windows . - le résultat sera évalué à une liste de 25 éléments. Cela implique qu'un total de 25 fichiers ont été ajoutés depuis la dernière exécution.

Nous pouvons mettre à jour List myModelList afin de refléter les changements dans C: \ Windows . J'imagine que myModelList soit enregistré dans une base de données ou un fichier afin d'être persistant.


1 commentaires

Oui merci, c'était l'autre moitié dont j'avais besoin pour achever ce que j'essaie d'accomplir. Avec cette variable de résultat, je peux obtenir les fichiers qui ont été ajoutés au dossier alors que mon application n'était pas ouverte. Et pour l'autre moitié, j'ai utilisé List UniqueIDCheckList = XMLList.Where (c =>! WinFileList.Contains (c.FilePath)). Reverse (). ToList (); ce qui me donne la liste des fichiers supprimés. Maintenant, je peux mettre à jour mon fichier XML à chaque fois que mon application démarre correctement, merci