1

我使用 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);

为什么结果不正确?我需要对物品进行分类吗?

4

3 回答 3

3

它们不是序列相等的,因为对象的顺序不同。如果你productsListSearch这样改变

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

SequenceEqual会回来True的。

ideone 上的演示

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

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

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

于 2013-07-14T12:27:01.517 回答
1

列表的顺序不同。将第二个列表更改为

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

结果将是真实的

SequenceEquals 表示序列必须相等。您在两个集合中都有相同的元素,但顺序不同。

于 2013-07-14T12:27:30.220 回答
0

我假设您的第二个数据集是您希望在对主要数据进行分组和排序后看到的方式。为此,您需要更改此行,以便对分组的项目进行排序:

var groupedCustomerList = products.GroupBy (u => u.RoleId)
        .Select (u => u.OrderBy (x => x.ObjectId));

这是获取第一个元素的一种更简洁的方式:

var firstGroup = groupedCustomerList.First ();
于 2013-07-14T12:29:52.227 回答