我使用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);
为什么结果不正确? 我需要对物品进行分类吗?
答案 0 :(得分:3)
它们不是序列相等的,因为对象的顺序不同。如果你改变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
或作为基于哈希的词典的键,则会出现问题。
答案 1 :(得分:1)
列表的顺序不同。将第二个列表更改为
List<Product> productsListSearch = new List<Product>()
{
new Product {ObjectId = 2, Read = false },
new Product {ObjectId = 1, Read = true }
};
,结果将是真的
SequenceEquals意味着序列必须相等。两个集合中的元素相同,但顺序不同。
答案 2 :(得分:0)
我假设您的第二个数据集是您在对主数据进行分组和排序后的预期效果。为了实现这一点,您需要更改此行,以便对您的分组项目进行排序:
var groupedCustomerList = products.GroupBy (u => u.RoleId)
.Select (u => u.OrderBy (x => x.ObjectId));
这是一个更清洁的方式来获得第一个元素:
var firstGroup = groupedCustomerList.First ();