好的,我有两个列表,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;
然而,当我运行程序时,缺少的列表总是与MasterTagList相同,尽管FoundTagList和MasterTagList都包含相同的元素,只是顺序不同。
解决: 事实证明,我最初在列表中添加内容的方式确实存在问题;因此,每个清单中的要素不一定相同。我回去修改了如何将内容添加到列表中,现在我的程序运行正常。感谢所有有建议的人!
答案 0 :(得分:1)
使用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
答案 1 :(得分:0)
List<string> missing = MasterTagList.Where(s => !FoundTagList.Contains(s)).ToList();
答案 2 :(得分:0)
使用Set而不是List。集合只允许一次存在一个值的单个实例(根据“Equals”方法或单独的相等比较器)。
此外,“Except”方法将正常工作,因为集合没有任何排序。
http://msdn.microsoft.com/en-us/library/bb359438.aspx
使用集合还可以提供额外的好处:在尝试添加之前,您无需检查找到的标记列表中是否已存在字符串。如果您尝试将已存在的项添加到集中,则不会发生任何事情。 HashSet对此也非常有效,因为它使用哈希表来快速查找现有项目。