繁体   English   中英

如何在linq中比较两个不区分大小写的复杂对象

[英]how to compare two complex object without case sensitive in linq

我必须列出对象。 所以我需要比较这些对象,并从“datActualItem”到列表获得满意的列表。 列表“datActualItem”项可能区分大小写,但列表“datFiltItem”项目都是小写字母,我的代码如下。

 var datActualItem = (List<UserRoleListViewModel>)TempResult.ToList();
    var datFiltItem = ((List<UserRoleListViewModel>)usersDataSource.Data).ToList();

    var objnewm = new List<UserRoleListViewModel>();
            foreach (var item in datActualItem)
            {
                objnewm.Add(datActualItem.Where(s => s.Equals(datFiltItem)).FirstOrDefault());
            }

注意: - 数组列表项Firstname是“Sajith”,其他列表包含“sajith”,因此目前没有检查。 我需要在不区分大小写的情况下检查并从“datActualItem”添加列表

在此输入图像描述 在此输入图像描述

要将2个列表与自定义比较策略进行比较,您可以创建一个实现IEqualityComparer<T>

public class MyClassComparer : IEqualityComparer<UserRoleListViewModel>
{
    public bool Equals(UserRoleListViewModel x, UserRoleListViewModel y)
    {
        return x.ID == y.ID
            && x.FirstName.Equals(y.FirstName, StringComparison.CurrentCultureIgnoreCase)
            && x.LastName.Equals(y.LastName, StringComparison.CurrentCultureIgnoreCase);
         // continue to add all the properties needed in comparison
    }

    public int GetHashCode(MyClass obj)
    {
        StringComparer comparer = StringComparer.CurrentCultureIgnoreCase;

        int hash = 17;
        hash = hash * 31 + obj.ID.GetHashCode();
        hash = hash * 31 + (obj.FirstName == null ? 0 : comparer.GetHashCode(obj.FirstName));
        hash = hash * 31 + (obj.LastName == null ? 0 : comparer.GetHashCode(obj.LastName));
        // continue all fields

        return hash;
    }
}

用法:

var list = actual.Except(expected, new MyClassComparer());

另一种方法是覆盖你自己的类UserRoleListViewModel相等,但这会影响一切,而不仅仅是这个Except方法。

使用StringComparison.OrdinalIgnoreCase

bool equals = string.Equals("Test", "test", StringComparison.OrdinalIgnoreCase);

如果需要在Except方法中使用它,则应创建实现IEqualityComparer类(请参阅本页 )并在该类中使用string.Equals("Test", "test", StringComparison.OrdinalIgnoreCase)来比较两个复杂对象。 Becasue Linq不知道你根据什么比较数据。

默认情况下,它会检查GetHashCodeEquals的结果(为任何对象实现),并且引用本身的引用类型的默认实现。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM