Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在c中从两个列表中创建新列表#_C#_Linq_Linq To Objects - Fatal编程技术网

C# 在c中从两个列表中创建新列表#

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

是否可以使用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"
}
};
//从数据库中检索
列表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'