c# - SequenceEqual linq 组

标签 c# linq equals

我使用 c# 3.5 和 linq 编写了一个简单的程序。

我有课

public class Product
{
    public Product()
    {

    }

    public int RoleId { get; set; }
    public int ObjectId { get; set; }
    public bool Read { get; set; }

    public override bool Equals(object obj)
    {
        return Equals((Product) obj);
    }

    public bool Equals(Product other)
    {
        return ObjectId == other.ObjectId && Read == other.Read;
    }

}

我正在尝试比较列表。

List<Product> products = new List<Product>() 
{ 
    new Product { RoleId = 1, ObjectId = 2, Read = false }, 
    new Product { RoleId = 2, ObjectId = 1, Read = false }, 
    new Product { RoleId = 1, ObjectId = 1, Read = true } 
};

var groupedCustomerList = products.GroupBy(u => u.RoleId)
                                  .Select(grp => grp.ToList()).ToList();

var firstGroup = groupedCustomerList.ElementAt(0);

List<Product> productsListSearch = new List<Product>() 
{ 
    new Product {ObjectId = 1, Read = true }, 
    new Product {ObjectId = 2, Read = false } 
};

var result= productsListSearch.SequenceEqual(firstGroup);

为什么结果不正确? 我需要对元素进行分类?

最佳答案

它们不是顺序相等的,因为对象的顺序不同。如果您像这样更改 productsListSearch

List<Product> productsListSearch = new List<Product>() 
{ 
    new Product {ObjectId = 2, Read = false } 
,   new Product {ObjectId = 1, Read = true }
};

SequenceEqual 将返回 True

Demo on ideone .

通常,您不应依赖 LINQ 生成的组中项目的顺序,除非您自己设置顺序:

var groupedCustomerList = products.GroupBy(u => u.RoleId)
    .Select(grp => grp.OrderBy(p => ...).ToList()).ToList();

注意:您的 Product 类会覆盖 Equals 而不会覆盖 GetHashCode。如果您决定在散列集中使用 Product 或将其用作基于散列的字典的键,这将是有问题的。

关于c# - SequenceEqual linq 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17639317/

相关文章:

c# - 带字符串开关的类

c# - C#中=>运算符的名称

java - 为什么 .equals 在比较相同字符串时返回 false?

C# 在泛型列表中使用 Equals 方法失败

java - 字符串不相等?测试我一直在做的 md5 哈希处理,是的,我正在使用 .equals

c# - 如何从 C# 应用程序控制面板的 "Manage another account"部分启动 "User Accounts"页面

c# - 解决链式计算的最快方法

linq - 无效的列名实体猜测不存在的外键

c# - 如何将正确的字段放入组中并使用 linq 求和?

c# - 如何使用 Skia 或 SkiaSharp 绘制富文本