2011-07-08 1 views
0

J'essaie de lire un fichier et de traiter en utilisant LINQ.Comment vérifier la liste dans LINQ

J'ai une liste d'exclusion où si je rencontre certains mots dans le fichier, je dois omettre cette ligne

mon code est

string sCodeFile = @"C:\temp\allcode.lst"; 
List<string> sIgnoreList = new List<string>() { "foo.c", "foo1.c" }; 
var wordsPerLine = from line in File.ReadAllLines(sCodeFile) 
        let items = line.Split('\n') 
        where !line.Contains(sIgnoreList.ToString()) 
        select line; 

foreach (var item in wordsPerLine) 
{ 
console.WriteLine(item); 
} 

Mon fichier LST ressemble ci-dessous

\voodoo\foo.c 
\voodoo\voodoo.h 
\voodoo\std.c 
\voodoo\foo1.h 

à la fin je veux seulement

\voodoo\voodoo.h 
\voodoo\std.c 

Comment puis-je traiter la liste ignorée dans contient? avec mon code ci-dessus je n'obtiens pas la sortie désirée pour sûr

quelqu'un peut-il aider?

salutations, Karthik

+3

vous mentionnez LINQ SQL, mais cela semble être LINQ-to-Objects ... y a-t-il un SQL ici? ou est-ce juste une faute de frappe? (indice: il affecte radicalement la réponse) –

+0

Désolé typo. Ma faute. J'essaie de lire le contenu du fichier en utilisant LINQ avec certaines conditions – KK99

+0

ALso: 'line.Split ('\ n')' - une ligne contient rarement '\ n', sinon ce n'est pas une ligne - devrait-il être quelque chose impliquant des barres obliques? –

Répondre

1

Révisée ma réponse. Le bug est que vous faites un ToString sur la liste des ignorés, ce qui ne fonctionnera certainement pas. Vous devez vérifier chaque élément dans la liste, ce qui peut être fait en utilisant quelque chose comme ceci:

where !sIgnoreList.Any(ignore => line.Contains(ignore)) 

Une curiosité: car le lambda ci-dessus ne fait que passer une valeur dans une méthode qui ne prend que la valeur en tant que paramètre, vous peut écrire ce encore plus compact en tant que groupe de méthode comme ceci:

where !sIgnoreList.Any(line.Contains) 
+0

désolé c'était un faute de frappe. Mais je ne peux pas obtenir mon résultat souhaité avec cet apporoack – KK99

+0

@Karthik, voir ma réponse révisée. –

+0

Merci Peter. J'ai bien travaillé. C'est ce dont j'avais besoin – KK99

1

essayer.

 string sCodeFile = @"C:\temp\allcode.lst"; 
     List<string> sIgnoreList = new List<string>() { "foo.c", "foo1.c" }; 

     var wordsPerLine = File.ReadAllLines(sCodeFile).Where(n => 
     { 
      foreach (var ign in sIgnoreList) 
      { 
       if (n.IndexOf(ign) != -1) 
        return false; 
      } 
      return true; 
     }); 

Elle passe l'élément de courant (n) à une fonction de lambda, qui vérifie contre chaque élément de la sIgnoreList. Renvoyer false signifie que l'élément est ignoré, true signifie qu'il est retourné.

+0

Essayé et n'a pas fonctionné – KK99

+0

Peut-être parce que vous cherchez 'foo.c' au lieu de' \ voodoo \ foo.c'? –

+0

Oui, je veux supprimer toutes les lignes qui contiennent foo.c. OK si je donne le chemin complet cela fonctionne. Mais je ne peux pas fournir le chemin complet en raison de mes exigences – KK99

0

Modifier à:

where !sIgnoreList.Contains(line) 

Vous devez comparer chaque ligne unique et vérifier qu'il n'existe pas dans la liste des ignorés.

C'est pourquoi la réponse de Vladislav n'a pas fonctionné.

+0

Seulement si je fournisse le chemin complet cela fonctionne ce qui n'est pas possible dans mon cas car j'ai Plus de 2000 lignes dans mon fichier LST – KK99

0

Voici la solution de travail:

 var result = from line in File.ReadAllLines(codeFile) 
        where !ignoreList.Any(line.Contains) 
        select line; 

le problème que vous a ne voulait pas vérifier l'ensemble pat h et foiré mots/lignes part un peu.

Questions connexes