2015-05-13 23 views
6

Env: C#, VStudio 2013 4.5 Framework WinFormsGraf von Dateien in C# mit LINQ

Tor: Wird die Anzahl der Dateien (Count) in einem Ordner und Unterordner, die Match in einem gespeicherte Erweiterungen String-Array. Das Array der Erweiterung kann mit dem "." von nicht. {".dat", "txt", ". msg"}

Was ich bis jetzt getan habe: Wenn ich das "." in der Reihe von Erweiterungen, alles funktioniert: { ".dat", "msg." "txt."}

Ich habe das Ersetzen versucht, aber es ist immer 0.

Der Arbeitscode Rückkehr (Nur wenn immer mit dem in Array von string) "":

string[] ext= new string[] { ".txt", ".msg", ".dat" }; 
totalFilesInTN = Directory.EnumerateFiles(dlg1.SelectedPath, "*.*", SearchOption.AllDirectories) 
          .Count(s => ext.Any(s1 => s1 == Path.GetExtension(s))); 

der nicht funktionierenden Code (immer 0 zurück):

string[] ext= new string[] { "txt", ".msg", "dat" }; 
totalFilesInTN = Directory.EnumerateFiles(dlg1.SelectedPath, "*.*", SearchOption.AllDirectories) 
          .Count(s => ext.Any(s1 => s1 == Path.GetExtension(s).Replace(".", ""))); 
+0

Try where-Klausel zuerst, dann die Zählung tun. – Nazmul

+0

@Nazmul: das ist im Grunde das gleiche wie ohne 'Where', aber ein Prädikat in' Count'. –

+0

Ich weiß, lass es versuchen und sehen, dass sich etwas ändert. Manchmal ist dies LINQ nicht möglich. – Nazmul

Antwort

7

die Dokumentation für die Path.GetExtension Methode stellt fest, dass der Rückgabewert i s:

Die Erweiterung des angegebenen Pfads (einschließlich des Punkts ".") oder null oder String.Empty.

Ihr zweiter Codeblock entfernt das '.' also wird keines der Elemente übereinstimmen. Gehen Sie daher mit Ihrer Liste der Erweiterungen in die entgegengesetzte Richtung und stellen Sie sicher, dass der Anfang jeder Erweiterung ein "." und dann benutze deinen ersten Code-Block.

string[] ext = new string[] {"txt", ".msg", ".dat" } 
    .Select(x => x.StartsWith(".") ? x : "." + x) 
    .ToArray(); 
+1

Der 'using System.Linq'-Hinweis ist redundant, da OP bereits LINQ verwendet, abgesehen davon +1 –

+0

Guter Punkt. Es ist noch früh für Details wie das :) aber ich möchte den zukünftigen Lesern klar machen. –

+0

Ich möchte nicht nitpick, aber wenn es akzeptiert wird, könnte es auch erwähnenswert, warum OPs zweiter Ansatz nicht funktioniert. Weil der Punkt aus dem 'Path.GetExtension'-Wert entfernt wird, aber nicht von seiner Array-Erweiterung. –

1

Sie müssen den . Punkt im Array ext Element und das Verzeichniselement sowohl ersetzen. Sie müssen .Replace mit s1 auch verwenden, um das Array und die Dateierweiterung nach dem Entfernen von Punkt aus jedem zu vergleichen.

string[] ext= new string[] { "txt", ".msg", "dat" }; 
totalFilesInTN = Directory.EnumerateFiles(dlg1.SelectedPath, "*.*", SearchOption.AllDirectories) 
       .Count(s => ext.Any(s1 => s1.Replace(".", "") == Path.GetExtension(s).Replace(".", ""))); 
1

Es funktioniert nicht, weil Sie die Punkte von beiden Erweiterungen entfernen müssen. Die Path.GetExtension immer vor dem Punkt. Aber es ist Ihr Erweiterungs-Array, das Erweiterungen ohne enthalten kann. So müssen Sie sowohl den Punkt aus entfernen, wenn Sie möchten, um sie vergleichen:

Also statt

....Count(s => ext.Any(s1 => s1 == Path.GetExtension(s).Replace(".", ""))); 

dies:

....Count(s => ext.Any(s1 => si.Replace(".", "") == Path.GetExtension(s).Replace(".", ""))); 

Aber wie andere schon erwähnt haben, fixieren Sie die ungültigen Quelle, Modifizieren Sie das Array, das nur Erweiterungen mit Punkt enthält. Dann ist es viel lesbarer und effizienter.

können Sie auch Contains verwenden:

....Count(s => ext.Contains(Path.GetExtension(s))); 
0

Dann GetExtension() -Methode enthält immer die, so dass Sie die Erweiterung normalisieren, die Sie überprüfen "".

string[] extensions = new string[] { "docx", ".msg", "pdf" }; 
var filesCount = Directory.EnumerateFiles(folderPath, "*.*", SearchOption.AllDirectories) 
.Count(filePath => extensions.Any(e => (e.StartsWith(".") ? e : "." + e) == Path.GetExtension(filePath))); 

Aber es ist besser, die Sammlung nur einmal am Anfang zu normalisieren.