【问题标题】:Comparing linkedlists c#比较链表c#
【发布时间】:2015-03-19 18:22:14
【问题描述】:

我在比较两个链表时遇到问题,我有 2 个用于参数的列表 list1 包含 {1,2,3,4,5}list2 包含 {1,3,4,5,6}

我没有使用linkedlistnodes 作为开始,这就是我在这里提出问题的原因,我确实尝试切换到笔记,但我的许多其他工作必须重新编写才能使其工作,我真的不想做。

到目前为止,这是我的代码,我正在尝试使用 2 个循环来循环和比较每个值。问题是它没有按我的预期工作,因为我认为它不会在继续之前将list1 的第一个值与list2 中的所有值进行比较。它难倒了我如何让这个工作,或者我是否以正确的方式去做。

bool c = false;
foreach (int s in list1) {
    foreach (int t in list2)
        if (s == t) {
            c = true;
            //The console write line in this part of the code is for testing
            Console.WriteLine("Both Lists Match  {0}, {1}", s, t);
            break;
        } else {
            c = false;
            //The console write line in this part of the code is for testing
            Console.WriteLine("Not a Match {0}, {1}", s, t);
        }
}

if (c == true) {
   Console.WriteLine("Both Lists Match");
} else {
    Console.WriteLine("Not a Match");
}

【问题讨论】:

  • 您知道它们在开始时已排序吗?您是否只需要确定它们是否相等?如果不相等,是否要所有差异(在 a 中找到不是 b,在 b 中找到不是 a)?
  • 我按照我生成它的方式做,但如果有办法比较它,我会更赞成。
  • 你可以使用 LINQ 吗? list1.SequenceEqual(list2) 应该会给你正确的答案...
  • 您想确定这些列表的哪些内容?任何一个中的任何元素是否等于另一个列表中相应索引的值?
  • 你应该看看stackoverflow.com/questions/12795882/…,看看它是否对你的情况有帮助。

标签: c# list linked-list compare


【解决方案1】:

您表示“我只是想测试list1 的所有元素是否都在list2 中”。

这可以使用两个嵌套循环来解决,您可以在其中比较列表中的元素,因为您正在尝试使用随问题发布的代码,但发布的代码存在一些问题。

就方法而言,考虑这个问题的最简单方法可能是:

  1. 假设list2 包含来自list1 的所有元素
  2. list1中的每个元素slist2中的元素t进行比较
  3. 如果s != t,对于list2 中的每个t,您就知道假设不正确,您可以停止搜索。

您可以通过以下方式解决此问题(对现有代码进行最少的更改):

    bool c = true; // assume each 's' is in 'list2'
    foreach (int s in list1)
    {
        bool contains_s = false; // 's' in 'list2' ?
        foreach (int t in list2)
        {
            if (s == t)
            {
                // found 's' in 'list2'.
                contains_s = true;
                //The console write line in this part of the code is for testing
                Console.WriteLine("Both Lists Match  {0}, {1}", s, t);
                break; // breaks out of the inner loop.
            }
        }
        if (!contains_s) // if 's' not found we are done.
        {
            c = false;
            break; // breaks out of the outer loop
        }
    }

    if (c == true)
    {
        Console.WriteLine("Both Lists Match");
    }
    else
    {
        Console.WriteLine("Not a Match");
    }

如果你使用的是 LINQ,你可以用一个更简单的语句来替换它,它基本上和上面的循环做同样的事情。

var doesNotContainAllElements = list1.Any(s => !list2.Contains(s));

var containsAllElements = list1.All(s => list2.Contains(s));

【讨论】:

  • 顺便说一句:为什么有人会使用O(n*n) 算法,因为它可以在线性时间内完成。
  • @EZ1,这对 {1, 2} 和​​ {1, 2, 3} 有效。请删除您对此不起作用的误导性评论。另外,关于您的第二条评论:鉴于 OP 的问题和发布的代码,对我来说,提供一个与他已经尝试做的事情一致的答案似乎是合理的,因为这更容易理解。你可能不熟悉“先让它工作,如果需要让它工作得更快”的说法。另外,请发布您的 O(n) 解决方案,我最感兴趣的是如何做到这一点。
  • 给定 list1={1,2}list2={1,2,3} 您的代码返回 Both Lists Match。那么什么是误导呢? (对于list2={1,2}list1={1,2,3},它返回Not a Match :)))MySolution:阅读 Jon Skeet 的评论..
  • 您可能希望阅读 OP 对 cme​​ts 中问题的回复。 OPs 问题(如我回答的第一行所示)似乎不是列表是否相等,而是list2 是否包含list1 中的每个项目。
  • 是的,这就是他的评论“我想看看我是否允许使用 linq,但我只是想测试 list1 的所有元素是否都在 list2 中”的含义。对于那个问题,这个答案是正确的。
猜你喜欢
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 2018-10-24
  • 1970-01-01
  • 2015-01-19
  • 2015-04-18
  • 2021-07-11
  • 2013-08-03
相关资源
最近更新 更多