我需要比较两个 List<object>
但是在比较具有“字符串”值的属性时我不想区分大小写。
我有一个类:
class User
{
public int Id { get;set; }
public string name { get;set; }
}
我有 2 个列表 List<User> olduser
和 List<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)应该覆盖 Equals
和 GetHashCode
(总是在一起)以支持在基于集合的集合中使用(如 HashSet<T>
或 Dictionary<TKey, TValue>
)。否则,您将使用来自 System.Object
的版本只是比较引用而不是属性。
关于c# - 根据标准比较两个对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57089160/