我们有两个学生名单及其分数:
existingList
学生成绩newList
学生成绩我想比较这两个列表
解决这个问题的最佳算法是什么? 希望专注于对新列表和性能进行最小程度的更改。
示例代码:
List<ListItem> existingList = new List<ListItem>();
List<ListItem> newList = new List<ListItem>();
public TopLists()
{
InitTwoLists();
}
private void InitTwoLists()
{
existingList.Add(new ListItem { Name = "Shane", Score = 100 });
existingList.Add(new ListItem { Name = "Mark", Score = 95 });
existingList.Add(new ListItem { Name = "Shane", Score = 94 });
existingList.Add(new ListItem { Name = "Steve", Score = 90 });
existingList.Add(new ListItem { Name = "Brian", Score = 85 });
existingList.Add(new ListItem { Name = "Craig", Score = 85 });
existingList.Add(new ListItem { Name = "John", Score = 82 });
existingList.Add(new ListItem { Name = "Steve", Score = 81 });
existingList.Add(new ListItem { Name = "Philip", Score = 79 });
existingList.Add(new ListItem { Name = "Peter", Score = 70 });
newList.Add(new ListItem { Name = "Shane", Score = 100 });
// This is change
newList.Add(new ListItem { Name = "Steve", Score = 96 });
newList.Add(new ListItem { Name = "Mark", Score = 95 });
newList.Add(new ListItem { Name = "Shane", Score = 94 });
newList.Add(new ListItem { Name = "Brian", Score = 85 });
newList.Add(new ListItem { Name = "Craig", Score = 85 });
newList.Add(new ListItem { Name = "John", Score = 82 });
newList.Add(new ListItem { Name = "Steve", Score = 81 });
newList.Add(new ListItem { Name = "Philip", Score = 79 });
newList.Add(new ListItem { Name = "Peter", Score = 70 });
}
}
如何实施
CompareLists()
public void CompareLists()
{
// How would I find the deltas and update the
// new list with any changes from old?
}
}
public class ListItem
{
public string Name { get; set; }
public int Score { get; set; }
}
** 编辑:所需的输出***
所需的输出是实际更改带有增量的 newList。 例如在这种情况下:
newList.Add(new ListItem { Name = "Shane", Score = 100 });
newList.Add(new ListItem { Name = "Steve", Score = 96 }); // This is change
newList.Add(new ListItem { Name = "Mark", Score = 95 });
newList.Add(new ListItem { Name = "Shane", Score = 94 });
newList.Add(new ListItem { Name = "Brian", Score = 85 });
newList.Add(new ListItem { Name = "Craig", Score = 85 });
newList.Add(new ListItem { Name = "John", Score = 82 });
newList.Add(new ListItem { Name = "Steve", Score = 81 });
newList.Add(new ListItem { Name = "Roger", Score = 80 }); // Roger is a new entry
newList.Add(new ListItem { Name = "Phillip", Score = 79 }); // Philip moved down one
// Peter 以 70 分从这个列表中删除,因为我只想要前 10 名。
所以变化是:
更新“Steve”的记录2,分数已改变 在位置 9 插入新记录“Roger” 打破了“Peter”跌出前 10 名的记录。
如果您正在寻找一种通用的、与语言无关的解决方案,那么您正在寻找某种有序列表的“数据同步”。基本算法是:
i1 = 0
i2 = 0
while (i1 < list1.size && i2 < list2.size)
{
if (list1[i1] < list2[i2])
{
//list1[i1] is not in list2
i1++
}
else if (list1[i1] > list2[i2])
{
//list2[i2] is not in list1
i2++
}
else
{
//item is in both lists
i1++
i2++
}
}
if (i1 < list1.size)
//all remaining list1 items are not in list2
if (i2 < list2.size)
//all remaining list2 items are not in list1
List<ListItem> list1 = GetYourList1();
List<ListItem> list2 = GetYourList2();
var diff = list1.Except(list2);
您的具体示例:
var diff = newList.Except(existingList);
不确定它是否是最有效的,但它很简洁:)
public static List<ListItem> CompareLists(List<ListItem> existingList, List<ListItem> newList)
{
List<ListItem> mergedList = new List<ListItem>();
mergedList.AddRange(newList);
mergedList.AddRange(existingList.Except(newList, new ListItemComparer()));
return mergedList.OrderByDescending(x => x.Score).Take(10).ToList();
}
public class ListItemComparer : IEqualityComparer<ListItem>
{
public bool Equals(ListItem x, ListItem y)
{
return x.Name == y.Name;
}
public int GetHashCode(ListItem obj)
{
return obj.Name.GetHashCode();
}
}
你可以这样称呼它:
newList = CompareLists(existingList, newList);