是否可以使用linq更清晰地编写它。
//retrieved from db
List<User> existingList = new List<User>()
{
new User() {
Id = 1,
Name = "test1",
City = "City1"
},
new User() {
Id = 2,
Name = "test2",
City = "City"
}
};
//modified by ui
List<User> modifiedlist = new List<User>()
{
new User() {
Id = 1,
Name = "test1",
City = "City1"
},
new User() {
Id = 3,
Name = "test3",
City = "City3"
}
};
数据库中的** :(按修改后的列表)我需要添加用户3并删除用户2而不要打扰1.
**用于删除user2,我循环遍历现有列表,如果不在修改列表中,则删除2. **以添加user3,我循环修改列表,如果现有列表中不存在,则添加3 < / p>
答案 0 :(得分:1)
这看起来就像你需要的那样 How to: Find the Set Difference Between Two Lists (LINQ):
List<int> existingList = new List<int>() { 1, 2 };
List<int> modifiedList = new List<int>() { 1, 3 };
var usersToDelete = existingList.Except(modifiedList).ToList(); //contains '2'
var usersToAdd = modifiedList.Except(existingList).ToList(); //contains '3'
答案 1 :(得分:-1)
如果您知道它是1,2,3并且您知道您想要它1,4 - 那么您可以只删除(2)删除3,然后将[1]设置为4以将2更改为4 。RemoveAt比Remove更快,因为它是索引。
var list = new List<int> {1,2,3};
list.RemoveAt(2);
list[1] = 4;
但是,当然如果你不知道你想删除的号码是否存在,以及它们存在的地方,你显然需要搜索它们......
现在,假设您知道列表已排序,并且非常庞大。
让我们考虑列表中有10,000个元素{0,2,5,6,8,...}随机排序数字的情况,并且您希望删除列表toRemove
中的所有数字,这也是排序{3,5,6,7,...}
那么除了toRemove.Count
次之外,您实际上可以迭代一次列表,如下所示:
int j = 0;
for (int i = 0; i < list.Count && j < toRemove.Count; i++)
{
if (list[i] == toRemove[j])
{
list.RemoveAt(i);
j++;
i--;
}
}
如果列表可能包含重复的数字{1,4,4,5,7,...},并且您希望以不存在单个4的方式删除4,则需要执行以下操作:< / p>
int j = 0;
for (int i = 0; i < list.Count && j < toRemove.Count; i++)
{
var currRemove = toRemove[j];
while (list[i] == currRemove)
{
list.RemoveAt(i);
i--;
}
j++;
}
修改强>
如果您希望它更干净,效率更低,您可以这样做:
list = list.Except(toRemove).Union(toAdd).ToList();
如果您不想添加已存在的项目:
var tmp = list.Except(toRemove);
list = list.Union(toAdd.Except(tmp)).ToList();
但我必须说这会非常缓慢,您可能想重新考虑使用列表,也许使用HashTable或词典。