gpt4 book ai didi

c# - 通过过滤将列表<>添加到另一个列表<>

转载 作者:行者123 更新时间:2023-12-03 18:25:12 32 4
gpt4 key购买 nike

我有一个模型类:

public class Person 
{
public int Id { get; set; }
public string Name { get; set; }
}

当我用这个添加两个列表时:
List<Person> people1 = new List<Person> {
new Person() { Id = 1, Name = "Name1" },
new Person() { Id = 2, Name = "Name2" },
new Person() { Id = 3, Name = "Name3" },
};

List<Person> people2 = new List<Person> {
new Person() { Id = 1, Name = "Name1" },
new Person() { Id = 4, Name = "Name4" },
new Person() { Id = 5, Name = "Name5" },
};

people1.AddRange(people2);

personpeople2有相同的 idpersonpeople1 ,我不想添加。我怎样才能做到这一点?

最佳答案

您可以相当容易地但效率低下地使用 LINQ:

people1.AddRange(people2.Where(p2 => !people1.Any(p1 => p1.Id == p2.Id)));

或者您可以先创建一组 ID:

HashSet<int> people1Ids = new HashSet<int>(people1.Select(p1 => p1.Id));
people1.AddRange(people2.Where(p2 => !people1Ids.Contains(p2.id));

第一种方法显然更简单,但是如果您的列表变大,它可能会变慢,因为对于 people2 中的每个元素,它将查看 people1 中的每个元素.

如果 people1,第二种方法会明显更快很大。如果是 people2相反,它很大,你不会得到太多好处。例如,如果 people1只包含几个人,那么在散列集中查找 ID 不会比查看列表快得多。

不过,您可以采用完全不同的方法。如果你让你的 Person打字机 IEquatable<Person>基于 ID - 或创建 IEqualityComparer<Person>这样做,如果您不太需要修改现有列表,那么您需要“两个列表的联合”,如果您不关心顺序,如果所有条目在每个列表中都是唯一的,或者您不介意删除重复项,您可以使用:

// Specify the comparer as another argument if you need to.
// You could call ToList on the result if you need a list.
var union = people1.Union(people2);

(这是该解决方案的很多条件,但它们很可能都是有效的。)

关于c# - 通过过滤将列表<>添加到另一个列表<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59281906/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com