Chúng tôi có hai danh sách, giả sử sinh viên và điểm số của họ. Tôi muốn so sánh hai danh sách này và tìm đồng bằng giữa danh sách mới và danh sách cũ, sau đó tìm cách xâm nhập ít nhất để Chèn hoặc Cập nhật vào danh sách mới bất kỳ thay đổi nào. Thuật toán tốt nhất để tiếp cận điều này là gì? Bạn muốn tập trung vào số lượng thay đổi tối thiểu đối với danh sách và hiệu suất mới.Mẫu/thuật toán hiệu quả nhất để so sánh hai danh sách và tìm đồng bằng giữa hai danh sách đó là gì?
Ví dụ mã:
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 });
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 = "Philip", Score = 79 });
newList.Add(new ListItem { Name = "Peter", Score = 70 });
}
}
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; }
}
** EDIT: mong muốn Output ***
Các đầu ra mong muốn là để thực sự thay đổi newList với đồng bằng châu thổ. Ví dụ trong kịch bản này:
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 rơi ra khỏi danh sách này với điểm số của mình là 70, vì tôi chỉ muốn top 10.
Vì vậy, những thay đổi sẽ là:
Cập nhật kỷ lục 2 cho "Steve", điểm số đã thay đổi Chèn bản ghi mới "Roger" tại vị trí 9 Thả bản ghi cho "Peter" ra khỏi đầu 10.
Bạn đang tìm kiếm một giải pháp chung? Hoặc có những ràng buộc nhất định như thứ tự sắp xếp cụ thể của các danh sách? –
Chúng ta có nên giả định rằng các danh sách sẽ giống nhau về kích thước? Bạn cũng muốn tìm các thành viên trong danh sách A không có trong danh sách B và ngược lại? –
giải pháp chung. các danh sách sẽ luôn bằng nhau. Thứ tự sắp xếp luôn là loại điểm giảm dần. – Shane