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