[英]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.