2012-09-07 73 views
0

有一個類:如何比較並使用Linq從字符串中選擇值?

class filedate 
{ 
     public int id; 
     public string fname; 
} 

填寫我的名單與價值觀:

List<filedate> List = ReadList(sqlFiles); 
string[] FolderFiles = System.IO.Directory.GetFiles(path2Copy); 

試圖讓結果:

var results = List.Where(filedate => 
     FolderFiles.Any(x=>Path.GetFileNameWithoutExtension(x) ==    
     Path.GetFileNameWithoutExtension(filedate.fname))); 

我在ListFolderFiles相同的文件,但得到在results沒有結果。我是Linq的新手。哪裏有問題?

更新: 列表:(計數)> 1000 例如: < 1023, 'tr_F2opervag_2808_1644.dat'>

FolderFiles例如: 「\\ domain.corp.dns \共享\文件夾\ tr_F2opervag_2808_1644.dat「

更新2: 找到我的錯誤!與交叉點評論是有幫助的!此代碼正在工作:

var results = List.Where(
      (filedate x) => 
      { 
       return ! FolderFiles.Any(xxx => 
       Path.GetFileNameWithoutExtension(xxx) == 
       Path.GetFileNameWithoutExtension(x.fname)); 
      }); 
+0

你聽說過'System.IO.FileInfo'嗎? [docs](http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx) – ChaosPandion

+0

你的代碼似乎是正確的,你會顯示示例輸入? –

+1

你對結果做什麼?你循環了嗎?你把它存儲在一個列表或數組中? – ChaosPandion

回答

0

您的代碼對我來說工作正常,所以從數據庫返回的列表中的數據格式有問題。

發佈來自filedata對象的fname值的示例。它需要是一個有效的完全合格的路徑。

這對我來說很好。

public class FileData{ 
    public int id; 
    public string fname; 
} 
void Main() 
{ 
    List<FileData> list = new List<FileData>{ 
     new FileData { id=1, fname="C:\\install.res.1042.dll"}, 
     new FileData { id=2, fname="C:\\install.res.1041.dll" }, 
     new FileData { id=3, fname="C:\\install.res.9999.dll"} 
    }; 

    string[] FolderFiles = System.IO.Directory.GetFiles("C:\\"); 

    var results = list 
     .Where(fd => 
      FolderFiles.Any(x=>Path.GetFileNameWithoutExtension(x) ==    
      Path.GetFileNameWithoutExtension(fd.fname))); 

    Console.WriteLine(results); 
} 
0

如果你需要找到差異,這應該工作。這可通過Enumerable.Except獲得。

var dbFiles = ReadList(sqlFiles); 

var dbFilePaths = 
    dbFiles.Select(fdate => 
     Path.GetFileNameWithoutExtension(fdate.fname).ToLower()); 

var fsFilePaths = 
    Directory 
    .GetFiles(path2Copy) 
    .Select(filePath => 
     Path.GetFileNameWithoutExtension(filePath).ToLower()); 

var diff = 
    dbFilePaths 
    .Except(fsFilePaths) 
    .Join(dbFiles, 
     filePath => filePath, 
     fdate => fdate.fname, 
     (filePath, fdate) => fdate) 
    .ToList(); 
+0

返回一個IEnumerable ...不是IEnumerable 這是我認爲他想要的。 否則相交將工作正常。 –

+0

@EoinCampbell - 更好? – ChaosPandion

+0

當然是:-) –