簡體   English   中英

C#LINQ語句

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM