比较两个有序列表的更新值
本文关键字:列表 更新 两个 比较 | 更新日期: 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在评论中提到的问题非常重要。尽管可能性很低,但解决方案应该是在所有情况下都有效的。
我建议您更改您的数据结构,并在您的实体旁边添加一个整数。该整数称为ID或Key,表示ID = 3的猫与ID = 7的猫之间的区别。所以你永远不会搞不清你要找的是哪只猫。新结构的最佳结构称为Dictionary。
我更改了下面的代码,结果cat和hamster:
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);
}