比较两个有序列表的更新值

本文关键字:列表 更新 两个 比较 | 更新日期: 2023-09-27 18:15:54

我有一个数据源,其中包含6个项目,顺序重要,每次我检查它时都会更新。
这是最初的列表
列表1:

  • 老鼠

然后我等待,列表更新了一些顶部的项目被删除,新的项目被添加。这是我获取的新列表。
列表2:

  • 老鼠
  • 仓鼠

我想找到一种方法来找出添加的新值,在本例中是cat + hamster。

我的实际问题有38个项目的来源,每个检查,在0 - 38个项目之间已添加到底部。然而,我只能看到最近的38个项目。

        List<string> list1 = new List<string>();
        List<string> list2 = new List<string>();
        list1.Add("dog");
        list1.Add("cat");
        list1.Add("fish");
        list1.Add("cat");
        list1.Add("cat");
        list1.Add("mouse");
        list2.Add("fish");
        list2.Add("cat");
        list2.Add("cat");
        list2.Add("mouse");
        list2.Add("cat");
        list2.Add("hamster");
        Console.WriteLine("List 1" + Environment.NewLine);
        foreach(string item in list1)
        {
            Console.WriteLine(item);
        }
        Console.WriteLine(Environment.NewLine + "List 2" + Environment.NewLine);
        foreach (string item in list2)
        {
            Console.WriteLine(item);
        }
        var newItems = list2.Except(list1);
        Console.WriteLine(Environment.NewLine + "New Items" + Environment.NewLine);
        foreach (string item in newItems)
        {
            Console.WriteLine(item);
        }

使用Except,结果是'仓鼠',因为cat确实存在于第一个列表中,并且Except似乎没有检查顺序(是否有一种方法?)

现在,这看起来很容易,好像它应该被回答,所以我想我只是没有在搜索中输入正确的东西。

感谢您的帮助。

编辑我可以想象这样一个解决方案:循环遍历大小不断增加的列表,从列表1的最后一个值和列表2的第一个值开始,然后使用SequenceEqual()直到false来计算有多少项重叠,并从那里开始。这是一个好的解决方案吗?

解决方案使用我按照编辑中提到的那样做了,并使用SequenceEqual()

循环比较匹配大小不断增加的列表。

我确信这是低效的,但这不会对我构成问题。如果有人知道一个更巧妙的技巧,那就太好了。

        int size1 = list1.Count();
        int size2 = list2.Count();
        int i;
        for (i = 1; i <= size2; i++)
        {
            List<string> aList = list1.GetRange(size1 - i, i);
            List<string> bList = list2.GetRange(0, i);
            if(aList.SequenceEqual(bList))
            {
                break;
            }
        }
        int totalAdded = size2 - i;
        List<string> newItemsList = list2.GetRange(i, totalAdded);
        foreach (string item in newItemsList)
        {
            Console.WriteLine(item);
        }
        Console.ReadLine();

比较两个有序列表的更新值

如果我理解正确的话,您希望使用新项目创建第三个列表?或者至少找到新的项目:

List<string> newItems = new List<string>();
newItems.AddRange(list2.FindAll(s=> !list1.Contains(s)));

StriplingWarrior在评论中提到的问题非常重要。尽管可能性很低,但解决方案应该是在所有情况下都有效的。

我建议您更改您的数据结构,并在您的实体旁边添加一个整数。该整数称为IDKey,表示ID = 3的猫与ID = 7的猫之间的区别。所以你永远不会搞不清你要找的是哪只猫。

新结构的最佳结构称为Dictionary

我更改了下面的代码,结果cathamster:

        int incrementalID = 0;
        Dictionary<int, string> list1 = new Dictionary<int, string>();
        Dictionary<int, string> list2 = new Dictionary<int, string>();
        list1.Add(incrementalID++, "dog");    //ID = 0
        list1.Add(incrementalID++, "cat");     //ID = 1
        list1.Add(incrementalID++, "fish");    //ID = 2
        list1.Add(incrementalID++, "cat");     //ID = 3
        list1.Add(incrementalID++, "cat");     //ID = 4
        list1.Add(incrementalID++, "mouse");   //ID = 5
        list2 = new Dictionary<int, string>(list1);
        list2.Remove(0);
        list2.Remove(1);
        list2.Add(incrementalID++, "cat");      //ID = 6
        list2.Add(incrementalID++, "hamster");  //ID = 7;
        Console.WriteLine("List 1" + Environment.NewLine);
        foreach (string item in list1.Values)
        {
            Console.WriteLine(item);
        }
        Console.WriteLine(Environment.NewLine + "List 2" + Environment.NewLine);
        foreach (string item in list2.Values)
        {
            Console.WriteLine(item);
        }
        var newItems = list2.Except(list1);
        Console.WriteLine(Environment.NewLine + "New Items" + Environment.NewLine);
        foreach (KeyValuePair<int, string> item in newItems)
        {
            Console.WriteLine(item.Value);
        }