簡體   English   中英

從列表中刪除項目<string>存在於 CheckedListBox 項的子串中

[英]Remove items from List<string> that exist in Substring of CheckedListBox items

在 WinForms 應用程序中,我有一個 CheckedListBox (lst_files) 和一個 List 類型的變量文件,其中填充了簡單的文本文件路徑。 例如,我將只使用文件中的一項

List<string> files = new List<string>() { "C:\\migration\\TestFiles\\New Text Document.txt" };

在填充 lst_files 之前,我從 lst_files 中已經存在的文件中刪除所有項目,方法是

files.RemoveAll(x => lst_files.Items.Contains(x));

如果文件在刪除“重復項”后仍有項目,我會填充 lst_files

lst_files.Items.AddRange(files.ToArray());

到目前為止,這一切都有效。

現在,由於需要過濾器,我添加了一個 Enum nist_type

internal enum nist_type
{
    add = 0
    ,
    update = 1
    ,
    delete = 2
}

Enum 的目的是確定我需要從每個單獨的文本文件中提取哪些記錄類型。 所以現在,當我填充 lst_files 時,我會

lst_files.Items.AddRange
(
    files
    .Select(s => "[" + String.Join("][", criteria.nist_types) + "] " + s)
    .ToArray()
);

在 lst_files 中,結果為(如果選擇了所有三個文件管理器)

[add][update][delete] C:\migration\TestFiles\New Text Document.txt

lst_files 中的輸出結果是完美的,沒有錯。 還要注意的是,文件的前綴可以是[add][update][delete]的任意組合; 它可以是三個之一,任何兩個,或所有三個。

由於 [add][update][delete] 前綴,我遇到的問題是檢查文件,該項目是否已存在於 lst_files 中。 我嘗試了各種方法,但似乎無法破解這一方法。 在這里,我嘗試刪除以文件中的項目結尾的項目,但這也不起作用

files.RemoveAll(x => lst_files.Items.Contains(lst_files.Items.Cast<string>().Where(s => s.EndsWith(x))));

我知道我可以在 for 循環中完成,這很容易,但我更願意以更優雅的 LINQ 方式完成並學習新的東西。

任何幫助,將不勝感激。

我正在嘗試這個,它工作正常:

files.RemoveAll(x => lst_files.Items.Cast<string>().Any(s => s.EndsWith(x)));

為了測試,我使用了:

internal enum nist_type
{
    add = 0,
    update = 1,
    delete = 2
}

List<string> files = new List<string>() { "C:\\migration\\TestFiles\\New Text Document.txt" };
string[] lst_files = files.Select(s => "[" + String.Join("][", new List<nist_type> { nist_type.add, nist_type.update }) + "] " + s).ToArray();

files.RemoveAll(x => lst_files.Any(s => s.EndsWith(x)));

我希望這會幫助您解決問題。

暫無
暫無

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

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