2011-07-13 55 views
0
  • 我有一個文件名列表(不是完整的路徑)。 (IEnumerable < string>)
  • 我有一個類的列表,其中包含一個字符串屬性(FullPath),其中包含完整的文件路徑。 (列表< CustomClass>)

如果任何CustomClass FullPath屬性存在於文件名列表中,它應該被刪除/忽略。我該如何改進這個C#.NET4代碼?

到目前爲止,我有這樣的:

this.myClasses.Add(new MyClass() { FullPath = @"C:\WorkingDirectory\File1.txt" }); 

files = new List<string>(new string[] { "File1.txt", "File2.txt", "File3.txt"}) 


List<string> newFiles = (from file in files 
         where File.Exists(Path.GetFullPath(file)) 
         select Path.GetFullPath(file)) 
       .ToList(); 

newFiles.RemoveAll(delegate(string path) 
{ 
    var r = from myClass in this.myClasses 
      where myClass.FullPath == path 
      select myClass; 
    return r.Count() > 0; 
}); 

newFiles現在包含文件2和文件3的完整路徑。

回答

1

你可以這樣說:

var fullPaths = myClasses.Select(x => x.FullPath).ToList(); 
var newFiles = files.Where(f => !fullPaths.Contains(Path.GetFullPath(f))); 

newFiles將包含 「FILE2.TXT」 和 「File3.txt」。
如果你想newFiles包含完整的路徑,可使用:

var fullPaths = myClasses.Select(x => x.FullPath).ToList(); 
var newFiles = files.Select(Path.GetFullPath) 
        .Except(fullPaths); 

如果你只想要回那些真正存在的文件,請使用以下兩種變化:

var fullPaths = myClasses.Select(x => x.FullPath).ToList(); 
var newFiles = files.Where(f => 
          { 
           var fullPath = Path.GetFullPath(f); 
           return !fullPaths.Contains(fullPath) 
             && File.Exists(fullPath); 
          }); 

var fullPaths = myClasses.Select(x => x.FullPath).ToList(); 
var newFiles = files.Select(Path.GetFullPath) 
        .Where(File.Exists) 
        .Except(fullPaths); 
+0

是的,他們必須都存在,我想要完整的路徑。所以你的例子no 4可能是我想要的方式。 –

+0

@CS:是的,例4是你想要的。 –