在c#中的两个列表中创建新列表

时间:2012-08-31 01:57:40

标签: 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> 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>

2 个答案:

答案 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或词典