如何使用Linq比较和选择字符串中的值?

时间:2012-09-07 15:52:00

标签: c# linq collections

有一堂课:

 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的新手。问题在哪里?

更新 清单:(计数)&gt; 1000 例如: &lt; 1023,'tr_F2opervag_2808_1644.dat'&gt;

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

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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);
}