gpt4 book ai didi

c# - 如何获取不在另一个列表C#中的列表元素

转载 作者:行者123 更新时间:2023-11-30 20:52:56 25 4
gpt4 key购买 nike

我想知道如何获取不在同一类型的另一个列表中的元素。

例子

List<Person> list1;
List<Person> list2;

list1[0] = "A"
list1[1] = "B"
list1[2] = "C"
list1[3] = "D"

list2[0] = "C"
list2[1] = "D"

我想要一个包含元素 A 和 B 的新列表

我正在尝试这样做,但没有成功。

var newList =list1.Except(list2).ToList();

最佳答案

1) 注意 Person可能不是值类型,而是引用类型。因此,Except不会比较值,而是比较引用。如果你想通过实例的属性(比如“名称”)应用“异常(exception)”逻辑,那么使用这样的东西:

string[] valuesToExclude = list1.Select(person => person.Name).ToArray();
var newList = list2.Where(person => !valuesToExclude.Contains(person.Name)).ToList();

2) 您也可以传递 IEqualityComparer<Person>Except :

public class PersonComparer : IEqualityComparer<Person>
{
public bool Equals(Person x, Person y)
{
return Equals(x.Name, y.Name);
}

public int GetHashCode(Person obj)
{
return obj.Name.GetHashCode();
}
}

这是第二个参数,如:

var newList = list2.Except(list1, new PersonComparer()).ToList();

3) 最后,值得注意的是如果 Personstruct (值类型),那么您的代码将按原样工作,假设所有属性都与您排除的实例相匹配。例如:

public struct Person
{
public string Name { get; set; }
}

List<Person> list1 = new List<Person>
{
new Person { Name = "A" },
new Person { Name = "B" },
};
List<Person> list2 = new List<Person>
{
new Person { Name = "A" },
};
var newList = list1.Except(list2).ToList();
// "B" only

关于c# - 如何获取不在另一个列表C#中的列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388879/

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