C# 在c中从两个列表中创建新列表#
是否可以使用linq以更干净的方式编写它C# 在c中从两个列表中创建新列表#,c#,linq,linq-to-objects,C#,Linq,Linq To Objects,是否可以使用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> modifi
//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"
}
};
//从数据库中检索
列表existingList=新列表()
{
新用户(){
Id=1,
Name=“test1”,
City=“City1”
},
新用户(){
Id=2,
Name=“test2”,
City=“城市”
}
};
//由用户界面修改
列表修改列表=新列表()
{
新用户(){
Id=1,
Name=“test1”,
City=“City1”
},
新用户(){
Id=3,
Name=“test3”,
City=“City3”
}
};
**在db中:(按修改后的列表)我需要添加用户3,删除用户2,而不必担心1
**为了删除user2,我在现有列表中循环,如果修改后的列表中不存在user2,则删除user2**对于添加user3,我将在修改后的列表中循环,如果现有列表中不存在,则添加3,如果您知道它是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;
如果列表可能包含重复的数字{1,4,4,5,7,…},并且您希望以不存在单个4的方式删除4,那么您需要执行以下操作:
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++;
}
如果您不想添加已经存在的项目:
var tmp = list.Except(toRemove);
list = list.Union(toAdd.Except(tmp)).ToList();
但我必须说,这将非常缓慢,您可能需要重新考虑使用列表,或者使用哈希表或字典,这看起来正是您需要的。
List existingList=newlist(){1,2};
List modifiedList=newlist(){1,3};
var usersToDelete=existingList.Except(modifiedList.ToList()//包含“2”
var usersToAdd=modifiedList.Except(existingList.ToList()//包含“3”
请编写您当前正在做的工作的示例?我们需要更多信息来回答您的问题。4是从哪里来的?这是另一张单子吗?为什么4被添加,为什么1没有被2和3删除?仍然没有足够的信息。正如dodexahedron所说,提供一个代码示例来说明您实际在做什么将有助于澄清。或者像我上面的评论所要求的那样,提供更多的上下文。这将以我认为OP无意的方式修改原始数组。这也是一个非常具体的解决方案,似乎是一个一般性的问题。@Dodexaderon是的,我也谈到了一般情况,说你不能删除你不知道其索引的项目,而不重复列表。我想我们都同意,我们需要对这个问题进行更好的澄清。:)对不起,这是很难写的。我试图修改它,请让我知道,如果我还需要清楚。我不能使用像RemoveAt这样的索引操作。谢谢Nathan和Torak,他们都很有帮助。因为性能不是一个很大的标准,所以我会使用LINQ。再次感谢!这与主题无关。。。他希望有效地添加和删除项目,而您所做的只是查找差异,而不是提醒列表。
list = list.Except(toRemove).Union(toAdd).ToList();
var tmp = list.Except(toRemove);
list = list.Union(toAdd.Except(tmp)).ToList();
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'