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

时间:2016-09-05 06:03:33

标签: c# linq case-sensitive

我必须列出对象。所以我需要比较这些对象并从" 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是&#34; Sajith&#34;其他名单包含&#34; sajith&#34;因此目前没有检查。   我需要在没有区分大小写的情况下进行检查   来自&#34; datActualItem&#34;的添加列表

enter image description here enter image description here

2 个答案:

答案 0 :(得分:4)

要将2个列表与自定义比较策略进行比较,您可以创建一个实现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的相等性,但这会影响所有内容,而不仅仅是accumarray(a(:,1), a(:,2), [], @min); 方法。

答案 1 :(得分:3)

使用StringComparison.OrdinalIgnoreCase

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

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

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