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

标签 c# string linq

我需要比较两个 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/

相关文章:

c# - 调用 LINQ First() 方法时出现 InvalidArgument 错误

c# - 使用 LINQ 将表中的逗号分隔字符串转换为不同的值集合

c# - 在后面的代码中找出哪个页面使用用户控件

c# - MVVMCross:如何将 Xamarin.Android 事件绑定(bind)到 ViewModel 命令

c# - EF6 不保存对相关属性的更改

regex - 使用 PCRE 正则表达式从类似 CSV 的字符串中提取值,包括空字段

c - 我有两个 char 数组,当它们的大小不同时,程序无法正确读取/写入它们

C# 序列化在子类中删除属性?

vb.net - 从文本中提取目录字符串

entity-framework - Entity Framework 和 LINQ To SQL - 利益冲突?