2011-07-13 16 views
0
  • 私はファイル名のリストを持っています(フルパスではありません)。 (IEnumerable < string>)
  • フルファイルパスを含む文字列プロパティ(FullPath)を含むクラスのリストがあります。 (List < 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は今FILE2 FILE3との完全なパスが含まれています。

答えて

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); 

を、これらの2つのバリエーションを使用します。

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

はい、すべて存在する必要があり、完全なパスが必要です。だからあなたの事例4は、おそらく私が望む方法です。 –

+0

@CS:はい、例4はあなたが望むものです。 –

関連する問題