gpt4 book ai didi

c# - 根据标准比较两个对象

转载 作者:太空狗 更新时间:2023-10-30 00:06:48 28 4
gpt4 key购买 nike

我需要比较两个 List<object>但是在比较具有“字符串”值的属性时我不想区分大小写

我有一个类:

class User
{
public int Id { get;set; }
public string name { get;set; }
}

我有 2 个列表 List<User> olduserList<User> newuser .我需要比较两个列表,但在比较时我应该忽略“名称”字段的大小写敏感性并在 olduser 中获取值不属于 newuser 中的值.

List<User> obsoleteUsers = olduser.Except(newuser).ToList();

我需要添加一个条件,在比较两个列表时,请忽略“名称”字段的大小写。

最佳答案

您可以使用自定义 IEqualityComparer<T> :

class UserNameComparer : IEqualityComparer<User>
{
public UserNameComparer(StringComparer comparer)
{
if (comparer == null) throw new ArgumentNullException(nameof(comparer));
this.Comparer = comparer;
}

public StringComparer Comparer { get; }

public bool Equals(User x, User y)
{
if (x == null || y == null) return true;
return Comparer.Equals(x.name, y.name);
}

public int GetHashCode(User obj)
{
return Comparer.GetHashCode(obj?.name);
}
}

您在 Except 中使用它(或其他 LINQ 方法):

List<User> obsoleteUsers = olduser
.Except(newuser, new UserNameComparer(StringComparer.InvariantCultureIgnoreCase))
.ToList();

通过这种方式,您可以针对不同的需求实现多个比较器,而无需更改原始类及其识别重复项的方式(例如通过 ID -属性)。

请注意 Except (以及其他基于集合的方法,如 Distinct )使用 GetHashCode快速检查一个对象是否等于另一个对象。这就是为什么你的类(class)应该覆盖 EqualsGetHashCode (总是在一起)以支持在基于集合的集合中使用(如 HashSet<T>Dictionary<TKey, TValue> )。否则,您将使用来自 System.Object 的版本只是比较引用而不是属性。

关于c# - 根据标准比较两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57089160/

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