2016-12-09 78 views
0

我有两个列表; List<int> numList具有标识号码作为其元素,并且List<string> filePaths具有需要作为其元素进行分析的文件路径。我想根据numList筛选filePaths;也就是说,我只想选择其文件名具有numList中存在的标识号的文件路径。C#LINQ语句

例如,filePaths

C:/test/1.test.xlsx 
C:/test/2.test.xlsx 
C:/test/3.test.xlsx 
C:/test/4.test.xlsx 

,并numList

1 
2 

在这种情况下,我想构建LINQ语句只得到

C:/test/1.test.xlsx 
C:/test/2.test.xlsx 

我试过

for(int i = 0; i < numList.Count; i++) 
{ 
    filePaths = filePaths.Where(f => Convert.ToInt32(GetNumberFromString(Path.GetFileName(f))) == numList[i]).ToList(); 
} 

这是GetNumberFromString helper方法

// Find number in the string 
private string GetNumberFromString(string value) 
{ 
    int number; 

    string resultString = Regex.Match(value, @"\d+").Value; 

    if (Int32.TryParse(resultString, out number)) 
    { 
     return resultString; 
    } 
    else 
    { 
     throw new Exception(String.Format("No number present in the file {0}", value)); 
    } 
} 

我认为这会工作,但有没有实现这一点的更优雅/有效的方法?

+0

的路径(C:/test/1.test.xlsx)会一直这样呢? (只有数字会改变)或者你想要一个在任何路径上工作的通用函数? – Jacob

+0

路径可以是任何文件,但所有文件都将位于同一个文件夹中。 – djskj189

+1

'var result = filePaths.Where(path => numList.Any(num => path.Contains(num)))。ToList()' – Developer

回答

0

您可以用一行代码做到这一点:

var filteredFilePaths = filePaths.Where(x => numList.Contains(GetNumberFromString(x)); 
+0

只是澄清一点,GetFileNumber等同于GetNumberFromString()方法吗?像,它不是一个内置功能 – djskj189

+0

正确的是。改变了我的答案。我试图Path.GetFileNameWithoutExtension(),但返回1.test,而不是1。 – Carra

0

我不喜欢这样。测试方法假定directory中的所有文件都具有适当格式的名称。如果这不是一个合理的假设,很容易修复。

然而,如果你只关心“文件号”在一个地方,这是矫枉过正。

public class TestClass 
{ 
    public static void TestMethod(String directory) 
    { 
     var files = System.IO.Directory.GetFiles(directory).Select(f => new FileInfo(f)).ToList(); 

     var numList = new[] { 1, 2 }; 

     var oneAndTwo = files.Where(fi => numList.Contains(fi.FileNumber)).ToList(); 
    } 
} 

public class FileInfo 
{ 
    public FileInfo() 
    { 
    } 
    public FileInfo(String path) 
    { 
     Path = path; 
    } 

    public int FileNumber { get; private set; } 
    private string _path; 
    public String Path 
    { 
     get { return _path; } 
     set 
     { 
      _path = value; 
      FileNumber = GetNumberFromFileName(_path); 
     } 
    } 

    public static int GetNumberFromFileName(string path) 
    { 
     int number; 

     var fileName = System.IO.Path.GetFileName(path); 

     string resultString = Regex.Match(fileName, @"\d+").Value; 

     if (Int32.TryParse(resultString, out number)) 
     { 
      return number; 
     } 
     else 
     { 
      throw new Exception(String.Format("No number present in the file {0}", path ?? "(null)")); 
     } 
    } 
} 
0

一个独立使用一衬垫加入:

var result = filePaths.Select(x => new { Filename = Path.GetFileName(x), x }) 
    .Join(numList, x => Regex.Match(x.Filename, "^([0-9]+)").Value, 
        y => y.ToString(), 
        (x, y) => x.x);