从主列表中删除找到的项目<t> </t>

时间:2013-06-14 16:31:12

标签: c# list except

好的,我有两个列表,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都包含相同的元素,只是顺序不同。

解决: 事实证明,我最初在列表中添加内容的方式确实存在问题;因此,每个清单中的要素不一定相同。我回去修改了如何将内容添加到列表中,现在我的程序运行正常。感谢所有有建议的人!

3 个答案:

答案 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对此也非常有效,因为它使用哈希表来快速查找现有项目。