簡體   English   中英

從主列表中刪除找到的項目<T>

[英]Removing Found Items from a Master List<T>

好的,所以我有兩個列表,MasterTagList和FoundTagList。 預先設置了主列表以及應該找到哪些標簽。 找到的列表由讀者實際找到的標簽組成。 我想做的是確定MasterTagList中沒有在找到的標簽列表中任何位置的項目,這意味着它們完全不存在。

我試圖使用Except()方法,但是由於某些原因,如果項目的順序不正確,則說明所有項目仍然缺失。

我還嘗試了看起來像這樣的代碼:

List<string> missing = new List<string>();
foreach (string T in MasterTagList)
{
    if (!FoundTagList.Contains(T))
    {
        missing.Add(T);
    }
}

我認為缺少的新列表應該顯示我所有在MasterTagList中的項目,而不是在FoundTagList中的所有項目,而不管順序如何。 我無論如何都不是C#的專家,所以我可能會錯過使用某些東西的機會。

我只想知道是否有一種方法可以修改此代碼以使其正常工作,或者是否有其他方法可以找到丟失的元素,而無需考慮順序。

提前致謝!

編輯:就像我說的,我已經嘗試過在這里看到建議的所有其他選擇。 我的Except()實例看起來像這樣:

List<string> missing = MasterTagList.Except(FoundTagList).ToList;

但是,當我運行程序時,盡管FoundTagList和MasterTagList都包含相同的元素,只是順序不同,但丟失的列表始終與MasterTagList相同。

已解決:原來我最初將內容添加到列表中的方式一定有問題; 因此,每個列表中的元素不一定相同。 我回過頭來修改了如何將內容添加到列表中,現在我的程序可以正常運行了。 謝謝所有提出建議的人!

使用Except方法可以非常簡單

List<string> missing = MasterTagList.Except(FoundTagList).ToList();

編輯

可以用以下方法驗證。 請注意,列表的順序無關緊要。 仍然會產生一個空列表(不丟失)。

List<string> Master = new List<string>()
    { "a", "b", "c", "d", "e", "f", "g", "h" };

List<string> Found = new List<string>() 
    { "g", "d", "e", "h", "a", "b", "c", "f" };

List<string> missing = Master.Except(Found).ToList();

Console.WriteLine(missing.Count); //Prints 0
List<string> missing = MasterTagList.Where(s => !FoundTagList.Contains(s)).ToList();

使用集合而不是列表。 集僅允許值的單個實例一次存在於集合中(根據“等於”方法或單獨的相等比較器)。

同樣,“ Except”方法將正確運行,因為集沒有任何排序。

http://msdn.microsoft.com/en-us/library/bb359438.aspx

使用集合還可以帶來額外的好處:在嘗試添加字符串之前,無需檢查字符串是否已存在於找到的標簽列表中。 如果您嘗試將現有項目添加到集合中,則不會發生任何事情。 HashSet對此非常有效,因為它使用哈希表快速查找現有項目。

暫無
暫無

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

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