0

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

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

4

3 回答 3

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
于 2013-06-14T16:42:52.477 回答
0
List<string> missing = MasterTagList.Where(s => !FoundTagList.Contains(s)).ToList();
于 2013-06-14T16:38:33.317 回答
0

使用 Set 而不是 List。集合只允许一个值的单个实例同时存在于集合中(根据“Equals”方法或单独的相等比较器)。

此外,“Except”方法将正常工作,因为集合没有任何排序。

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

使用集合还将提供额外的好处:您无需在尝试添加之前检查字符串是否已存在于找到的标签列表中。如果您尝试将已存在的项目添加到集合中,则不会发生任何事情。HashSet 对此也非常有效,因为它使用哈希表来快速查找现有项目。

于 2013-06-14T17:14:47.377 回答