簡體   English   中英

檢查字符串包含使用Linq且不區分大小寫的列表中的所有元素

[英]Check String contain all elements in list using Linq and case insensitive

我想編寫一個過濾目錄中文件的函數。 方法接收的路徑,文件必須包含的令牌列表以及文件中不應包含的令牌列表。

我的代碼是這樣的:

private String[] enumerateFilesByFilter(String path, List<String> contain, List<String> notContain)
{
    String[] files = Directory.GetFiles(path).Where(f => (contain.All(f.Contains)) && (!notContain.Any(f.Contains))).ToArray();
    //String[] files = Directory.GetFiles(path).Where(f => f.IndexOf(contain.All(f.Contains), 0, StringComparison.CurrentCultureIgnoreCase) != -1).ToArray();
    return files;
}

我嘗試接收符合條件的文件列表,但我成功獲取了正確的列表,但僅用於敏感令牌。

(在表彰中,您可以看到我嘗試獲取一個不區分大小寫的代碼,但是有錯誤...)

如果不區分大小寫,如何檢查文件名是否包含列表中的所有字符串?

編輯,例如:

假設我的目錄中有以下文件:

proj_debug_3.2.0.txt

proj_release_3.2.1.txt

proj_release_3.2.1_useThis_TRY.txt

proj_release_3.2.1_UseThis.txt

所以打電話給

enumerateFilesByFilter(path, new List<String> { "Release", "useThis" }, new List<String> {"try", "debug" });

應該返回proj_release_3.2.1_UseThis.txt文件

謝謝 !

這應該可以按需工作:

private String[] enumerateFilesByFilter(String path, List<String> contain, List<String> notContain)
{
    String[] files = Directory.EnumerateFiles(path)
        .Where(f => contain.All(s => s.IndexOf(f, StringComparison.CurrentCultureIgnoreCase) >= 0)
             && !notContain.Any(s => s.IndexOf(f, StringComparison.CurrentCultureIgnoreCase) >= 0))
        .ToArray();
    return files;
}

請注意,我使用Directory.EnumerateFiles而不是Directory.GetFiles因為它可以在返回所有文件之前開始處理,而不是先創建所有文件數組的GetFiles

也許您還應該考慮使用System.IO.Path.GetFileName(f)僅檢查文件名而不是完整路徑。

首先,我將為不區分大小寫的搜索定義一個新的擴展方法:

public static class StringExtensions
{
    public static bool Contains(this string source, string pattern, StringComparison comparision)
    {
        return source.IndexOf(pattern, comparision) >= 0;
    }
}

然后像這樣重寫您的方法:

public static IEnumerable<string> EnumerateFilesByFilter(String path, List<String> include, List<String> exclude)
    {
        return Directory.EnumerateFiles(path).
            Where(f => include.All(i => f.Contains(i, StringComparison.OrdinalIgnoreCase))).
            Where(f => exclude.All(i => !f.Contains(i, StringComparison.OrdinalIgnoreCase)));
    }

請注意,我使用IEnumerable作為返回類型,並使用Directory.EnumerateFiles()作為文件系統列表。 這樣,整個操作更加高效,並且僅使用枚舉。

終於我找到了解決方案(該解決方案很丑但是可以正常工作):

private String[] enumerateFilesByFilter(String path, List<String> contain, List<String> notContain)
{
    String[] files = Directory.EnumerateFiles(path).Where(f => (contain.All(c => f.ToLower().Contains(c.ToLower()))) &&
        (!notContain.Any(c => f.ToLower().Contains(c.ToLower())) )).ToArray();
    return files;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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