我使用 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
。
通常,您不应依赖 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/