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 Réponses :
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;
}
}
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 ();
models.Except (models.Where (y => strings.Contains (y.FilePath)));
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.
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
var differentFilePaths = customList.Where (c =>! stringList.Contains (c.FilePath));Vous pouvez utiliser
Selectpour projeter la propriété de chaîne que vous souhaitez comparer. Ensuite,Exceptfonctionne mais vous obtenez uneList . 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?