[英]C# LINQ statement
我有两个清单。 List<int> numList
具有标识号作为其元素,而List<string> filePaths
具有指向文件的路径,该文件需要作为其元素进行分析。 我想基于numList
过滤filePaths
; 也就是说,我只想选择文件名具有numList
存在的标识符号的numList
。
例如, 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));
}
}
我认为这会起作用,但是是否有更优雅/更有效的方法来实现这一目标?
您可以使用单线执行此操作:
var filteredFilePaths = filePaths.Where(x => numList.Contains(GetNumberFromString(x));
我会这样 该测试方法假定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)"));
}
}
}
使用Join的独立One-liner:
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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.